This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push:
new 5ccd4eb Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63236
5ccd4eb is described below
commit 5ccd4eb4017ceb5fcabd1a8a11b81ca664f1d852
Author: Mark Thomas <[email protected]>
AuthorDate: Thu Mar 7 19:36:43 2019 +0000
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63236
Use intern() as suggested by Phillip Webb to reduce memory wasted due to
string duplication. Saves ~254k on a clean install.
Thanks to YourKit for helping to track these down.
---
java/org/apache/catalina/util/LifecycleMBeanBase.java | 2 +-
java/org/apache/tomcat/util/digester/CallMethodRule.java | 2 +-
java/org/apache/tomcat/util/digester/Digester.java | 8 ++------
java/org/apache/tomcat/util/modeler/ManagedBean.java | 4 ++--
.../modeler/modules/MbeansDescriptorsIntrospectionSource.java | 4 ++--
webapps/docs/changelog.xml | 7 +++++++
6 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/java/org/apache/catalina/util/LifecycleMBeanBase.java
b/java/org/apache/catalina/util/LifecycleMBeanBase.java
index 49770a1..def6453 100644
--- a/java/org/apache/catalina/util/LifecycleMBeanBase.java
+++ b/java/org/apache/catalina/util/LifecycleMBeanBase.java
@@ -271,7 +271,7 @@ public abstract class LifecycleMBeanBase extends
LifecycleBase
this.mserver = server;
this.oname = name;
- this.domain = name.getDomain();
+ this.domain = name.getDomain().intern();
return oname;
}
diff --git a/java/org/apache/tomcat/util/digester/CallMethodRule.java
b/java/org/apache/tomcat/util/digester/CallMethodRule.java
index 7651776..288312e 100644
--- a/java/org/apache/tomcat/util/digester/CallMethodRule.java
+++ b/java/org/apache/tomcat/util/digester/CallMethodRule.java
@@ -257,7 +257,7 @@ public class CallMethodRule extends Rule {
throws Exception {
if (paramCount == 0) {
- this.bodyText = bodyText.trim();
+ this.bodyText = bodyText.trim().intern();
}
}
diff --git a/java/org/apache/tomcat/util/digester/Digester.java
b/java/org/apache/tomcat/util/digester/Digester.java
index 1bb2d20..3b0f35e 100644
--- a/java/org/apache/tomcat/util/digester/Digester.java
+++ b/java/org/apache/tomcat/util/digester/Digester.java
@@ -903,7 +903,7 @@ public class Digester extends DefaultHandler2 {
// Fire "body" events for all relevant rules
List<Rule> rules = matches.pop();
if ((rules != null) && (rules.size() > 0)) {
- String bodyText = this.bodyText.toString();
+ String bodyText = this.bodyText.toString().intern();
for (int i = 0; i < rules.size(); i++) {
try {
Rule rule = rules.get(i);
@@ -1917,17 +1917,13 @@ public class Digester extends DefaultHandler2 {
for (int i = 0; i < nAttributes; ++i) {
String value = newAttrs.getValue(i);
try {
- String newValue = IntrospectionUtils.replaceProperties(value,
null, source);
- if (value != newValue) {
- newAttrs.setValue(i, newValue);
- }
+ newAttrs.setValue(i,
IntrospectionUtils.replaceProperties(value, null, source).intern());
} catch (Exception e) {
log.warn(sm.getString("digester.failedToUpdateAttributes",
newAttrs.getLocalName(i), value), e);
}
}
return newAttrs;
-
}
diff --git a/java/org/apache/tomcat/util/modeler/ManagedBean.java
b/java/org/apache/tomcat/util/modeler/ManagedBean.java
index 49af85c..31e3d20 100644
--- a/java/org/apache/tomcat/util/modeler/ManagedBean.java
+++ b/java/org/apache/tomcat/util/modeler/ManagedBean.java
@@ -562,7 +562,7 @@ public class ManagedBean implements java.io.Serializable {
StringUtils.join(operation.getSignature(), ',', (x) -> x.getType(),
key);
key.append(')');
- return key.toString();
+ return key.toString().intern();
}
@@ -572,6 +572,6 @@ public class ManagedBean implements java.io.Serializable {
StringUtils.join(parameterTypes, ',', key);
key.append(')');
- return key.toString();
+ return key.toString().intern();
}
}
diff --git
a/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java
b/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java
index 1a68c5e..630bde3 100644
---
a/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java
+++
b/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java
@@ -348,8 +348,8 @@ public class MbeansDescriptorsIntrospectionSource extends
ModelerSource
for(int i=0; i<parms.length; i++ ) {
ParameterInfo pi=new ParameterInfo();
pi.setType(parms[i].getName());
- pi.setName( "param" + i);
- pi.setDescription("Introspected parameter param" + i);
+ pi.setName(("param" + i).intern());
+ pi.setDescription(("Introspected parameter param" +
i).intern());
op.addParameter(pi);
}
mbean.addOperation(op);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 3331c08..47b7b59 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -81,6 +81,13 @@
searching for nested groups when the JNDIRealm is configured with
<code>roleNested</code> set to <code>true</code>. (markt)
</fix>
+ <fix>
+ <bug>63236</bug>: Use <code>String.intern()</code> as suggested by
+ Phillip Webb to reduce memory wasted due to String duplication. This
+ changes saves ~245k when starting a clean installation. With additional
+ thanks to YourKit Java profiler for helping to track down the wasted
+ memory and the root causes. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]