提交 da43f2cc 编写于 作者: M mgerdin

8013129: Possible deadlock with Metaspace locks due to mixed usage of...

8013129: Possible deadlock with Metaspace locks due to mixed usage of safepoint aware and non-safepoint aware locking
Summary: Change Metaspace::deallocate to take lock with _no_safepoint_check_flag
Reviewed-by: coleenp, jmasa, dholmes
上级 61a8b6f4
...@@ -2945,7 +2945,7 @@ void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) { ...@@ -2945,7 +2945,7 @@ void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) {
if (SafepointSynchronize::is_at_safepoint()) { if (SafepointSynchronize::is_at_safepoint()) {
assert(Thread::current()->is_VM_thread(), "should be the VM thread"); assert(Thread::current()->is_VM_thread(), "should be the VM thread");
// Don't take Heap_lock // Don't take Heap_lock
MutexLocker ml(vsm()->lock()); MutexLockerEx ml(vsm()->lock(), Mutex::_no_safepoint_check_flag);
if (word_size < TreeChunk<Metablock, FreeList>::min_size()) { if (word_size < TreeChunk<Metablock, FreeList>::min_size()) {
// Dark matter. Too small for dictionary. // Dark matter. Too small for dictionary.
#ifdef ASSERT #ifdef ASSERT
...@@ -2959,7 +2959,7 @@ void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) { ...@@ -2959,7 +2959,7 @@ void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) {
vsm()->deallocate(ptr, word_size); vsm()->deallocate(ptr, word_size);
} }
} else { } else {
MutexLocker ml(vsm()->lock()); MutexLockerEx ml(vsm()->lock(), Mutex::_no_safepoint_check_flag);
if (word_size < TreeChunk<Metablock, FreeList>::min_size()) { if (word_size < TreeChunk<Metablock, FreeList>::min_size()) {
// Dark matter. Too small for dictionary. // Dark matter. Too small for dictionary.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册