RFR: 8327247: C2 uses up to 2GB of RAM to compile complex string concat in extreme cases [v2]

Brett Okken duke at openjdk.org
Sat Apr 13 17:57:44 UTC 2024


On Fri, 12 Apr 2024 10:19:27 GMT, Claes Redestad <redestad at openjdk.org> wrote:

>> src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java line 1430:
>> 
>>> 1428:                     cb.new_(STRING_BUILDER);
>>> 1429:                     cb.dup();
>>> 1430:                     cb.invokespecial(STRING_BUILDER, "<init>", MethodTypeDesc.ofDescriptor("()V"));
>> 
>> Would there be value in initializing to a larger capacity? Given the number of append calls, seems the default cap of 16 is unlikely to be sufficient.
>
> Possibly. I tried a few simple variants that initialized the `StringBuilder` capacity at various guesses, such as sum of constant sizes + some factor based on args, but across a diverse set of micros that gives both some wins and some regressions. Getting the estimation just right is pretty tricky, especially when size of the arguments are arbitrary (like for any String/Object arg).

What are the scenarios which had regressions? 
Given the conservative growth for StringBuilder, it surprises me a bit that any scenario would regress.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/18690#discussion_r1564165946


More information about the core-libs-dev mailing list