RFR: 8317692: jcmd GC.heap_dump performance regression after JDK-8292818 [v2]

Alex Menkov amenkov at openjdk.org
Sat Oct 14 01:20:14 UTC 2023


On Fri, 13 Oct 2023 19:08:19 GMT, Hannes Greule <hgreule at openjdk.org> wrote:

>> See the bug description for more information.
>> 
>> This implementation brings down the time to take a heap dump on the example application in the bug report to <2 seconds on my machine.
>
> Hannes Greule has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision:
> 
>  - whitespace
>  - add test to verify all instance fields are present in heap dump
>  - Merge remote-tracking branch 'upstream/master' into perf/fieldstream
>  - whitespaces
>  - Iterate fields forwards on thread dump

test/hotspot/jtreg/serviceability/HeapDump/FieldsInInstanceTest.java line 124:

> 122: 
> 123:             Iterable<JavaHeapObject> objects = snapshot.getThings()::asIterator;
> 124:             for (JavaHeapObject heapObj : objects) {

Instead if iteration over all dumped objects it would be faster to:
`
       (JavaObject)snapshot.findClass(className).getInstances(false).nextElement();
`

test/hotspot/jtreg/serviceability/HeapDump/FieldsInInstanceTest.java line 126:

> 124:             for (JavaHeapObject heapObj : objects) {
> 125:                 if (heapObj instanceof JavaObject javaObj) {
> 126:                     if (javaObj.getClazz().getName().endsWith("$B")) {

Suggestion:

                    if (javaObj.getClazz().getName().equals(FieldsInInstanceTarg.B.class.getName())) {

test/hotspot/jtreg/serviceability/HeapDump/FieldsInInstanceTest.java line 139:

> 137:                         Asserts.assertTrue(asString.contains("3"), "value for field A.a not found");
> 138:                         Asserts.assertTrue(asString.contains("Field"), "value for field A.s not found");
> 139:                         System.out.println(fields);

Suggestion:

                        log(fields);

And I think it makes sense to print field values before asserts (so they appear in the log if some assertion throw an exception)

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16083#discussion_r1359022900
PR Review Comment: https://git.openjdk.org/jdk/pull/16083#discussion_r1359000757
PR Review Comment: https://git.openjdk.org/jdk/pull/16083#discussion_r1359005734


More information about the hotspot-dev mailing list