RFR: JDK-8318636: Add jcmd to print annotated process memory map [v4]
Thomas Stuefe
stuefe at openjdk.org
Sat Oct 28 07:29:37 UTC 2023
On Fri, 27 Oct 2023 22:01:07 GMT, Gerard Ziemski <gziemski at openjdk.org> wrote:
>> Thomas Stuefe has updated the pull request incrementally with three additional commits since the last revision:
>>
>> - Fix spelling
>> - timeout fuse
>> - Feedback Johan
>
> src/hotspot/share/services/memMapPrinter.cpp line 294:
>
>> 292: // the absolute runtime of printing to blocking other VM operations too long.
>> 293: const jlong timeout_at = os::javaTimeNanos() +
>> 294: ((jlong)(SafepointTimeoutDelay * NANOSECS_PER_MILLISEC) / 2);
>
> Is AbortVMOnSafepointTimeoutDelay/2 timeout useful for real world cases?
>
> I assume the client who would need this feature, would need it for a reason and that means memory hungry processes?
>
> Instead of blocking VM and having to use the timeout, can we:
>
> A. take a snapshot of NMT virtual memory region and process it without blocking the VM
>
> B. divide this process into smaller chunks, each of which will be guaranteed to finish before AbortVMOnSafepointTimeoutDelay triggers
>
> C. temporarily increase AbortVMOnSafepointTimeoutDelay and revert it back afterwords?
>
> In case A,B we would get back a very close, but not exact view of memory, but wouldn't this be better than getting back precise, but cut off view?
>
> Case C would give us what the users wants assuming they are OK with waiting a bit longer?
>
> And adding malloc'ed memory here would be make this issue much worse.
The whole abort-on-timeout thing I added because I run the command in a VMOp, and it runs in a VMOp because I want to print information about GC threads (so, not because of NMT) and I was not sure how long the GC Thread* objects are guaranteed to live. Otherwise, I would not have bothered. AbortVMOnSafepointTimeoutDelay is by default 10 seconds, that is really plenty.
But....
Gaaah! :-( I just tried to dump a million mappings in a test and found that the limiting factor is the output stream size of the jcmd bufferedStream. It looks like jcmd buffers the whole $%!& output before sending it over the wire. For hypothetical situations with millions of mappings, this would mean an additional memory footprint in the GB range. Thats quite annoying.
I opened https://bugs.openjdk.org/browse/JDK-8319055 to track that, but have not high hopes of someone actually having the time for it. A potential solution using temporary buffers (an outputStream variant that under the hood buffers its content in a temp file) would be simple, but a bit embarrassing and may need convincing folks.
I need to think about this...
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/16301#discussion_r1375189381
More information about the hotspot-runtime-dev
mailing list