RFR: 8307348 - Parallelize heap walk for ObjectCount(AfterGC) JFR event collection [v5]

Albert Mingkun Yang ayang at openjdk.org
Fri May 5 11:38:18 UTC 2023


On Fri, 5 May 2023 11:30:23 GMT, olivergillespie <duke at openjdk.org> wrote:

>> ObjectCount(AfterGC) event does a full single-threaded heap scan at a safepoint. After https://bugs.openjdk.org/browse/JDK-8215624, it is trivial to use the parallel version of the heap scan, reducing the time spent at the safepoint, and thus reducing the overhead of this event.
>> 
>> The performance improvement is obvious, but just for confirmation, on my 16-core host, at around 1GB occupancy:
>> 
>> 
>> Before: 770ms ( [3.059s][debug][gc,phases         ] GC(13) Report Object Count 770.317ms )
>>  After:  92ms ( [2.335s][debug][gc,phases         ] GC(13) Report Object Count  91.742ms )
>> 
>> 
>> Question 1: Should this be the default behaviour for populate_table (use the number active workers as the parallelism, if nothing else specified)?
>> 
>> Question 2: Is active_workers the correct value to use here? Or is max_workers more appropriate?
>
> olivergillespie 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 six additional commits since the last revision:
> 
>  - Rework
>    
>    Pass workers through from caller. Move some of the specific handling
>    to the VM Op for heap inspection.
>  - Merge remote-tracking branch 'origin/master' into 8307348
>  - Use ParallelGCThreads instead of active_workers
>  - Fix compile error
>    
>    ```
>     === Output from failing command(s) repeated here ===
>    * For target hotspot_variant-server_libjvm_objs_gcTrace.o:
>    /home/runner/work/jdk/jdk/src/hotspot/share/gc/shared/gcTrace.cpp: In member function 'void GCTracer::report_object_count_after_gc(BoolObjectClosure*)':
>    /home/runner/work/jdk/jdk/src/hotspot/share/gc/shared/gcTrace.cpp:114:48: error: invalid use of incomplete type 'class CollectedHeap'
>      114 |       WorkerThreads* workers = Universe::heap()->safepoint_workers();
>          |                                                ^~
>    In file included from /home/runner/work/jdk/jdk/src/hotspot/share/gc/shared/gcTrace.cpp:35:
>    /home/runner/work/jdk/jdk/src/hotspot/share/memory/universe.hpp:42:7: note: forward declaration of 'class CollectedHeap'
>       42 | class CollectedHeap;
>          |       ^~~~~~~~~~~~~
>    
>    * All command lines available in /home/runner/work/jdk/jdk/build/linux-x64/make-support/failure-logs.
>    === End of repeated output ===
>    ```
>  - Fix compile error
>  - 8307348 - Parallelize heap walk for ObjectCount(AfterGC) JFR event collection

src/hotspot/share/gc/shared/gcVMOperations.cpp line 174:

> 172:       // Can't run with more threads than provided by the WorkerThreads.
> 173:       const uint capped_parallel_thread_num = MIN2(_parallel_thread_num, workers->max_workers());
> 174:       WithActiveWorkers with_active_workers(workers, capped_parallel_thread_num);

`WithActiveWorkers` is an stack-obj, so it must be in the same scope as using workers.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/13774#discussion_r1185989473


More information about the hotspot-gc-dev mailing list