--- old/src/share/vm/gc/g1/g1ConcurrentMark.cpp 2016-09-14 14:48:25.145527455 +0200 +++ new/src/share/vm/gc/g1/g1ConcurrentMark.cpp 2016-09-14 14:48:24.996522844 +0200 @@ -241,8 +241,11 @@ G1CMMarkStack::OopChunk* G1CMMarkStack::remove_chunk_from_chunk_list() { MutexLockerEx x(MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag); - _chunks_in_chunk_list--; - return remove_chunk_from_list(&_chunk_list); + OopChunk* result = remove_chunk_from_list(&_chunk_list); + if (result != NULL) { + _chunks_in_chunk_list--; + } + return result; } G1CMMarkStack::OopChunk* G1CMMarkStack::remove_chunk_from_free_list() { @@ -270,7 +273,7 @@ bool G1CMMarkStack::par_push_chunk(oop* ptr_arr) { // Get a new chunk. - OopChunk* new_chunk = remove_chunk_from_list(&_free_list); + OopChunk* new_chunk = remove_chunk_from_free_list(); if (new_chunk == NULL) { // Did not get a chunk from the free list. Allocate from backing memory. @@ -284,24 +287,21 @@ Copy::conjoint_oops_atomic(ptr_arr, new_chunk->data, OopsPerChunk); - add_chunk_to_list(&_chunk_list, new_chunk); - Atomic::inc(&_chunks_in_chunk_list); + add_chunk_to_chunk_list(new_chunk); return true; } bool G1CMMarkStack::par_pop_chunk(oop* ptr_arr) { - OopChunk* cur = remove_chunk_from_list(&_chunk_list); + OopChunk* cur = remove_chunk_from_chunk_list(); if (cur == NULL) { return false; } - Atomic::dec(&_chunks_in_chunk_list); - Copy::conjoint_oops_atomic(cur->data, ptr_arr, OopsPerChunk); - add_chunk_to_list(&_free_list, cur); + add_chunk_to_free_list(cur); return true; }