RFR: 8301403: Eliminate memory allocations in JVMFlag::printFlags during signal handling [v6]

Thomas Stuefe stuefe at openjdk.org
Thu Jul 25 09:39:33 UTC 2024


On Wed, 24 Jul 2024 17:31:04 GMT, Gerard Ziemski <gziemski at openjdk.org> wrote:

>> Allocating memory while handling an error should be avoided, however `JVMFlag::printFlags()` is used by crash log and it allocates memory to print flags sorted (using qsort).
>> 
>> We avoid memory allocation by using a simple in place algorithm that uses JVMFlag 1 bit of unused data from its private `Flags` enum data member. It is O(n^2) algorithm, compared to O(n*log(n)) for qsort, however, it's called while handling an error log, so the speed here is not paramount. Also, I measured the real impact on a simple test case and I actually observed performance improvement of about x2.5 faster (2,885,973ns in place ordered printing vs 7,389,456ns for qsort). This is because we ended up having to qsort all flags when only a fraction of them actually end up being printed.
>> 
>> Running MACH5 tests...
>
> Gerard Ziemski has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - move include
>  - use local stack storage for the sorting indicies

Okay

src/hotspot/share/runtime/flags/jvmFlag.cpp line 709:

> 707:   // Print the flag with best sort value, then mark it.
> 708:   for (size_t j = 0; j < length; j++) {
> 709:     JVMFlag* bestFlag = nullptr;

small nit, you only need to keep track of the index in the loop, since JVMFlag* follows from index.

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

Marked as reviewed by stuefe (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/20202#pullrequestreview-2198812895
PR Review Comment: https://git.openjdk.org/jdk/pull/20202#discussion_r1691148800


More information about the hotspot-runtime-dev mailing list