Request for review: 8044406: JVM crash with JDK8 (build 1.8.0-b132) with G1 GC

Mikael Gerdin mikael.gerdin at oracle.com
Mon Aug 18 08:32:04 UTC 2014


Hi Poonam,

On 2014-08-17 02:54, Poonam Bajaj wrote:
> Hi,
>
> Could I have reviews for the fix for a G1 GC crash:
>
> 8044406 <https://bugs.openjdk.java.net/browse/JDK-8044406>: JVM crash
> with JDK8 (build 1.8.0-b132) with G1 GC
> Webrev: http://cr.openjdk.java.net/~poonam/8044406/webrev.00/webrev/

7020     // Determine how far we are from the next card boundary. If it 
is smaller than
7021     // the minimum object size we can allocate into, expand into 
the next card.
7022     size_t top = cur->used();
7023     size_t aligned_top = align_size_up_(top, 
G1BlockOffsetSharedArray::N_bytes);

It seems a bit odd to me to do this calculation on the sizes instead of 
the addresses in the region. Also, the naming is confusing since "top" 
almost always refers to the topmost allocated address in a particular 
memory range.
Can you change the above to
HeapWord* top = cur->top();
HeapWord* aligned_top = align_ptr_up...


7024
7025     size_t to_allocate_words = (aligned_top - top) / HeapWordSize;

The subtraction should be replaced by a call to pointer_delta if you 
change the types of top and aligned_top to pointers.

7026     if ((cur->top() + to_allocate_words) != cur->end() && // Not 
completely filled yet.
7027         (to_allocate_words != 0) && // Not at card boundary.
7028         (to_allocate_words <= CollectedHeap::min_fill_size())) {
7029       // Cannot fit any object into the area to the next card 
boundary. Simply create
7030       // an object that fits a single object.
7031       to_allocate_words += CollectedHeap::min_fill_size();
7032     }

Generally, if you feel the need to explain each condition in a 
three-clause if statement then maybe it's a good idea to rephrase it in 
some way. Maybe use a MAX2-expression to get above the minimum object 
size and move the "to_allocate_words != 0" check to encompass the entire 
filling logic?

7033
7034     if (to_allocate_words != 0) {
7035       HeapWord* dummy = 
G1AllocRegion::attempt_allocation(to_allocate_words, true /* bot_updates 
*/);

You don't need the G1AllocRegion scope prefix here, attempt_allocation 
is in the current scope.

7036       CollectedHeap::fill_with_object(dummy, to_allocate_words);
7037     }

/Mikael

>
> The crash happens with the following stack trace:
> Stack: [0x00007fd435a1f000,0x00007fd435b20000], sp=0x00007fd435b1bc30,
> free space=1011k
> Native frames: (J=compiled Java code, j=interpreted, Vv=VM code,
> C=native code)
> V  [libjvm.so+0x541261]
> G1BlockOffsetArray::forward_to_block_containing_addr_slow(HeapWord*,
> HeapWord*, void const*)+0xf1
> V  [libjvm.so+0x959e54] DirtyCardToOopClosure::do_MemRegion(MemRegion)+0x64
> V  [libjvm.so+0x56d2a4] ScanRSClosure::doHeapRegion(HeapRegion*)+0x374
> V  [libjvm.so+0x542dd0]
> G1CollectedHeap::collection_set_iterate_from(HeapRegion*,
> HeapRegionClosure*)+0x60
> V  [libjvm.so+0x56c08c]  G1RemSet::scanRS(OopsInHeapRegionClosure*,
> CodeBlobToOopClosure*, int)+0xdc
> V  [libjvm.so+0x56c4d5]
> G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure*,
> CodeBlobToOopClosure*, int)+0x145
> V  [libjvm.so+0x549ef4] G1CollectedHeap::g1_process_strong_roots(bool,
> SharedHeap::ScanningOption, OopClosure*, OopsInHeapRegionClosure*,
> G1KlassScanClosure*, int)+0x224
> V  [libjvm.so+0x558a88]  G1ParTask::work(unsigned int)+0xb88
> V  [libjvm.so+0xa4a9ff]  GangWorker::loop()+0xcf
> V  [libjvm.so+0x8a0058]  java_start(Thread*)+0x108
>
> Here, the GC thread crashes while scanning the RemSet (part of the
> non-CSet regions). And it happens to scan a region to which another
> thread in G1ParEvacuateFollowersClosure is copying contents to, and this
> region was found out to be an Old GC alloc region.
>
> This change makes sure that we fill up the last card of the Old GC alloc
> region that was being allocated into, with a dummy object so that it
> does not get scanned by the remset scanning GC threads.
>
> This change applies cleanly to 8u and 7u repos.
>
> Thanks to Thomas Schatzl for his help in investigating the crash and
> suggesting this solution.
>
> Testing:
> - JPRT
> - Testing by Coherence QA
>
> Thanks,
> Poonam
>


More information about the hotspot-gc-dev mailing list