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 <ma...@apache.org>
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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to