Shenandoah: Question about asserts

Zhengyu Gu zgu at redhat.com
Thu Sep 9 14:22:10 UTC 2021


Hi Per,

Shenandoah heap dump was designed to be single-threaded. It looks like 
that JDK-8237354 breaks that.

Feel free to remove the assertions to unblock your work. I will file a 
bug to fix Shenandoah heap dump.

Thanks,

-Zhengyu

On 9/9/21 5:48 AM, Per Liden wrote:
> Hi Shenandoah-folks,
> 
> When doing some random testing of 
> https://github.com/openjdk/jdk/pull/5410 I noticed that Shenandoah ran 
> into a few asserts during heap dumping. The asserts check that we're 
> executing in the VM thread. However, I wonder if these asserts might be 
> a bit too aggressive, or if there's a reason these functions must only 
> be executed by the VM thread? I couldn't see any obvious reason, so I 
> simply removed the offending asserts (see patch below) and nothing 
> obvious seems to break (heap dumping tests now pass, etc).
> 
> So, would you mind if I remove these asserts, or are they really needed 
> for some reason I've missed?
> 
> cheers,
> Per
> 
> 
> diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp 
> b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
> index ca9afd7ad4f..623ca9574a2 100644
> --- a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
> @@ -355,7 +355,6 @@ 
> ShenandoahCodeRootsIterator::ShenandoahCodeRootsIterator() :
>           _par_iterator(CodeCache::heaps()),
>           _table_snapshot(NULL) {
>     assert(SafepointSynchronize::is_at_safepoint(), "Must be at 
> safepoint");
> -  assert(!Thread::current()->is_Worker_thread(), "Should not be 
> acquired by workers");
>     CodeCache_lock->lock_without_safepoint_check();
>     _table_snapshot = 
> ShenandoahCodeRoots::table()->snapshot_for_iteration();
>   }
> diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp 
> b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp
> index c0469a71d7b..261920a9d7a 100644
> --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp
> @@ -258,7 +258,6 @@ 
> ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() :
>    }
> 
>    void ShenandoahHeapIterationRootScanner::roots_do(OopClosure* oops) {
> -   assert(Thread::current()->is_VM_thread(), "Only by VM thread");
>      // Must use _claim_none to avoid interfering with concurrent CLDG 
> iteration
>      CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
>      MarkingCodeBlobClosure code(oops, 
> !CodeBlobToOopClosure::FixRelocations);
> diff --git 
> a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp 
> b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp
> index 3f614d1e208..b2897d380aa 100644
> --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp
> @@ -86,9 +86,8 @@ ShenandoahClassLoaderDataRoots<CONCURRENT, 
> SINGLE_THREADED>::ShenandoahClassLoad
>       ClassLoaderDataGraph_lock->lock();
>     }
> 
> -  // Non-concurrent mode only runs at safepoints by VM thread
> +  // Non-concurrent mode only runs at safepoints
>     assert(CONCURRENT || SafepointSynchronize::is_at_safepoint(), "Must 
> be at a safepoint");
> -  assert(CONCURRENT || Thread::current()->is_VM_thread(), "Can only be 
> done by VM thread");
>   }
> 
>   template <bool CONCURRENT, bool SINGLE_THREADED>
> 




More information about the hotspot-gc-dev mailing list