You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by "Thiago Henrique De Paula Figueiredo (Jira)" <ji...@apache.org> on 2021/09/29 21:49:00 UTC

[jira] [Assigned] (TAP5-2694) Tapestry PlasticClassPool makes thousands of duplicate strings

     [ https://issues.apache.org/jira/browse/TAP5-2694?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Thiago Henrique De Paula Figueiredo reassigned TAP5-2694:
---------------------------------------------------------

    Assignee: Thiago Henrique De Paula Figueiredo

> Tapestry PlasticClassPool makes thousands of duplicate strings
> --------------------------------------------------------------
>
>                 Key: TAP5-2694
>                 URL: https://issues.apache.org/jira/browse/TAP5-2694
>             Project: Tapestry 5
>          Issue Type: Improvement
>          Components: plastic
>    Affects Versions: 5.7.3
>            Reporter: Nikkie Folts
>            Assignee: Thiago Henrique De Paula Figueiredo
>            Priority: Major
>         Attachments: Screen Shot 2021-09-29 at 4.02.26 PM.png, Screen Shot 2021-09-29 at 4.03.04 PM.png, Screen Shot 2021-09-29 at 5.23.53 PM.png
>
>
> I have completed a memory profile of our Tapestry application, and found that the PlasticClassPool has lots of duplicate Strings in memory. After some investigation, it seems that the InheritanceData#getValue() method is the likely culprit.
> Example Strings:
> "toString:()"
> "get:(Ljava/lang/Object;)"
> "getPropertyName:()"
> h4. The current method:
> {code:java}
>     /**
>      * Combines a method name and its desc (which describes parameter types and return value) to form
>      * a value, which is how methods are tracked.
>      */
>     private static String toValue(String name, String desc)
>     {
>         // TAP5-2268: ignore return-type to avoid methods with the same number (and type) of parameters but different
>         //            return-types which is illegal in Java.
>         // desc is something like "(I)Ljava/lang/String;", which means: takes an int, returns a String. We strip
>         // everything after the parameter list.
>         int endOfParameterSpecIdx = desc.indexOf(')');
>         return name + ":" + desc.substring(0, endOfParameterSpecIdx+1);
>     }
> {code}
> h4. The change is simple one-liner to the return statement:
> {code}
> return (name + ":" + desc.substring(0, endOfParameterSpecIdx+1)).intern();
> {code}
> The profile also showed that there are lots of "duplicate" InheritanceData objects... the interning will help with their size, but why have so many duplicate?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)