Directions on fixing JDK-8297285
Kennke, Roman
rkennke at amazon.de
Thu Nov 24 15:48:14 UTC 2022
Hi Ashu,
In ShenandoahPacer::pace_for_alloc(), there is a check like this:
// Threads that are attaching should not block at all: they are not
// fully initialized yet. Blocking them would be awkward.
// This is probably the path that allocates the thread oop itself.
if (JavaThread::current()->is_attaching_via_jni()) {
return;
}
Maybe the right thing to do is to add a check for whether or not the
thread is in threads list or is_active_Java_thread() ?
Also, CCing Aleksey, because he originally wrote this code, IIRC.
Thanks,
Roman
> Any suggestions on the problem mentioned in the previous email?
> I would like to add that the problem is likely to become more apparent
> with https://bugs.openjdk.org/browse/JDK-8293650
> <https://bugs.openjdk.org/browse/JDK-8293650> as it would increase heap
> utilization during VM init.
>
> Thanks,
> Ashutosh Mehra
>
>
> ---------- Forwarded message ---------
> From: *Ashutosh Mehra* <asmehra at redhat.com <mailto:asmehra at redhat.com>>
> Date: Mon, Nov 21, 2022 at 4:09 PM
> Subject: Directions on fixing JDK-8297285
> To: <shenandoah-dev at openjdk.org <mailto:shenandoah-dev at openjdk.org>>
>
>
> Hi,
>
> I am trying to find a way to fix JDK-8297285: Shenandoah pacing causes
> assertion failure during VM initialization.
>
> The scenario is during VM init if the main thread exhausts the
> allocation budget, then the shenandoah pacer would cause it to wait. The
> call to wait can hit assertion self->is_active_Java_thread() in
> Monitor::wait() as the main thread is not yet added to the thread list,
> and therefore is_active_Java_thread() returns false.
>
> The approach I have in mind is to delay initialization of
> ShenandoahPacer until the main thread is considered an active Java
> thread. But there is no hook to capture that event in the GC. The
> closest I found is `CollectedHeap::post_initialize()`. The comments for
> `CollectedHeap::post_initialize()` indicate this /may/ be the right
> place to initialize the ShenandoahPacer:
>
> ```
> // In many heaps, there will be a need to perform some initialization
> activities
> // after the Universe is fully formed, but before general heap
> allocation is allowed.
> // This is the correct place to place such initialization methods.
> virtual void post_initialize();
> ```
>
> However, there are still some VM init activities between the call to
> CollectedHeap::post_initialize() in universe_post_init and the call to
> Threads::add(main_thread) in Threads::create_vm(). So initializing in
> CollectedHeap::post_initialize() can still break if enough heap
> allocations happen during those activities.
> I am wondering if there is a better place to initialize the
> ShenandoahPacer, or another approach to fix this situation.
> Here is the current set of changes [0] that initialize ShenandoahPacer
> in CollectedHeap::post_initialize().
>
> [0]
> https://github.com/openjdk/jdk/compare/master...ashu-mehra:jdk:JDK-8297285 <https://github.com/openjdk/jdk/compare/master...ashu-mehra:jdk:JDK-8297285>
>
> Thanks,
> Ashutosh Mehra
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
More information about the shenandoah-dev
mailing list