RFR: 8299426: Heap dump does not contain virtual Thread stack references
Serguei Spitsyn
sspitsyn at openjdk.org
Wed Nov 29 22:42:03 UTC 2023
On Tue, 14 Nov 2023 21:54:06 GMT, Alex Menkov <amenkov at openjdk.org> wrote:
> The change impelements dumping of unmounted virtual threads data (stack traces and stack references).
> Unmounted vthreads can be detected only by iterating over the heap, but hprof stack trace records (HPROF_FRAME/HPROF_TRACE) should be written before HPROF_HEAP_DUMP/HPROF_HEAP_DUMP_SEGMENT.
> HeapDumper supports segment dump (parallel dump to separate files with subsequent file merge outside of safepoint), the fix switches HeapDumper to always use segment dump: 1st segment contains only non-heap data, other segments are used for dumping heap objects. For serial dumping single-threaded dumping is performed, but 2 segments are created anyway.
> When HeapObjectDumper detects unmounted virtual thread, it writes HPROF_FRAME/HPROF_TRACE records to the 1st segment ("global writer"), and writes thread object (HPROF_GC_ROOT_JAVA_FRAME) and stack references (HPROF_GC_ROOT_JAVA_FRAME/HPROF_GC_ROOT_JNI_LOCAL) to the HeapObjectDumper segment.
> As parallel dumpers may write HPROF_FRAME/HPROF_TRACE concurrently and VMDumper needs to write non-heap data before heap object dumpers can write virtual threads data, writing to global writer is protected with DumperController::_global_writer_lock.
>
> Testing: run tests which perform heap dump (in different scenarios):
> - test/hotspot/jtreg/serviceability
> - test/hotspot/jtreg/runtime/ErrorHandling
> - test/hotspot/jtreg/gc/epsilon
> - test/jdk/sun/tools/jhsdb
src/hotspot/share/services/heapDumper.cpp line 1947:
> 1945: _complete_number(0),
> 1946: _started(false),
> 1947: _global_writer_lock(new (std::nothrow) Mutex(Mutex::nosafepoint, "DumpWriter_lock"))
We discussed a suggestion to place both lock definitions together:
- lines: 1934 & 1939
- lines: 1943 & 1947
Also, it will be nice to add a comment at the start of `DumperController` constructor to explain why we use `MutexLocker` with the flag `Mutex::_no_safepoint_check_flag`.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/16665#discussion_r1409946659
More information about the serviceability-dev
mailing list