RFR: 8355635: Do not collect C strings in C2 scratch buffer
Vladimir Kozlov
kvn at openjdk.org
Sun Apr 27 01:09:44 UTC 2025
On Sat, 26 Apr 2025 22:56:23 GMT, John R Rose <jrose at openjdk.org> wrote:
>> [JDK-8349479](https://bugs.openjdk.org/browse/JDK-8349479) added call to `code_string()` for Halt node mach node.
>> I am observing several more creation and clearing C strings collections during C2 compilation:
>> [17.405s][debug][codestrings] Clear 2 asm-remarks.
>> [17.405s][debug][codestrings] Clear 1 dbg-string.
>>
>> Most are coming from temporary scratch buffer C2 uses for code size calculation. I suggest to not collect strings in this buffer.
>>
>> Note, `CodeSection::set_scratch_emit()` is only called from [PhaseOutput::scratch_emit_size()](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/output.cpp#L3368) for scratch buffer.
>>
>> I verified with `-XX:CompileCommand=print,<classpath>::<method>` that hsdis output is the same.
>>
>> Running on linux-x64 with fastdebug VM:
>>
>> before:
>> $ java -XX:-TieredCompilation -Xlog:codestrings=debug com.sun.tools.javac.Main HelloWorld.java | grep codestrings |wc
>> 1644 6576 80618
>>
>> after again:
>> $ java -XX:-TieredCompilation -Xlog:codestrings=debug com.sun.tools.javac.Main HelloWorld.java | grep codestrings |wc
>> 0 0 0
>>
>>
>> It is more dramatic with `-Xcomp` we use for testing:
>>
>> Before
>> $ java -XX:-TieredCompilation -Xcomp -Xlog:codestrings=debug com.sun.tools.javac.Main HelloWorld.java | grep codestrings |wc
>> 70924 283696 3533261
>>
>> After fix
>> $ java -XX:-TieredCompilation -Xcomp -Xlog:codestrings=debug com.sun.tools.javac.Main HelloWorld.java | grep codestrings |wc
>> 0 0 0
>>
>>
>> I was curious why it is 0 - we do deoptimize nmethod. But with big default CodeCache GC does not collect them.
>> Reducing CodeCache to 8Mb shows deallocation:
>>
>> $ java -XX:-TieredCompilation -Xcomp -Xlog:codestrings=debug -Xlog:codecache=debug -XX:+PrintCodeCache -XX:ReservedCodeCacheSize=8M com.sun.tools.javac.Main HelloWorld.java
>> ...
>> [40.196s][debug][codestrings] Clear 42 asm-remarks.
>> [40.196s][debug][codestrings] Clear 1 dbg-string.
>> [40.196s][debug][codecache ] *flushing nmethod 5811/0x00007f71d74b7188. Live blobs:3370/Free CodeCache:2953Kb
>>
>>
>> Tested tier1-5, Xcomp,comp-stress.
>
> Yeah, the zero was puzzling to me too; looked like evidence that we killed all the strings, not just the ones in the scratch assembly. But your extra demonstration shows that we collect the strings we want for the non-scratch assemblies.
>
> Good change.
Thank you, @rose00
-------------
PR Comment: https://git.openjdk.org/jdk/pull/24893#issuecomment-2832846623
More information about the hotspot-compiler-dev
mailing list