Description
When Metaspace::allocate fails, it throws an exception. Since the VM thread cannot throw exceptions, it cannot call this function:
We have an assert that's supposed to catch this, but it was coded incorrectly:
https://github.com/openjdk/jdk/blob/master/src/hotspot/share/memory/metaspace.cpp#L797
assert(!(DumpSharedSpaces && THREAD->is_VM_thread()), "sanity");
Because DumpSharedSpaces is false when running the JVM regularly, this assert will always pass. Changing it to
assert(!THREAD->is_VM_thread(), "can't allocate in VM thread because we cannot throw exception");
will cause the following crash in test/com/sun/jdi/ModulesTest.java
Stack: [0x00007fc3738fa000,0x00007fc3739fa000], sp=0x00007fc3739f87b0, free space=1017k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x126a9c1] Metaspace::allocate(ClassLoaderData*, unsigned long, MetaspaceObj::Type, Thread*)+0x1e1
V [libjvm.so+0x1295321] MethodCounters::allocate(methodHandle const&, Thread*)+0x41
V [libjvm.so+0x128b73e] Method::build_method_counters(Method*, Thread*)+0x3e
V [libjvm.so+0x128bd93] BreakpointInfo::set(Method*)+0x123
V [libjvm.so+0x106f066] JvmtiBreakpoint::each_method_version_do(void (Method::*)(int))+0x56
V [libjvm.so+0x173caf7] VM_Operation::evaluate()+0x187
V [libjvm.so+0x1760bdc] VMThread::inner_execute(VM_Operation*)+0x30c
V [libjvm.so+0x1761535] VMThread::loop()+0x255
V [libjvm.so+0x17617dc] VMThread::run()+0xcc
V [libjvm.so+0x166f066] Thread::call_run()+0xf6
V [libjvm.so+0x138a0f6] thread_native_entry(Thread*)+0x116
We have an assert that's supposed to catch this, but it was coded incorrectly:
https://github.com/openjdk/jdk/blob/master/src/hotspot/share/memory/metaspace.cpp#L797
assert(!(DumpSharedSpaces && THREAD->is_VM_thread()), "sanity");
Because DumpSharedSpaces is false when running the JVM regularly, this assert will always pass. Changing it to
assert(!THREAD->is_VM_thread(), "can't allocate in VM thread because we cannot throw exception");
will cause the following crash in test/com/sun/jdi/ModulesTest.java
Stack: [0x00007fc3738fa000,0x00007fc3739fa000], sp=0x00007fc3739f87b0, free space=1017k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x126a9c1] Metaspace::allocate(ClassLoaderData*, unsigned long, MetaspaceObj::Type, Thread*)+0x1e1
V [libjvm.so+0x1295321] MethodCounters::allocate(methodHandle const&, Thread*)+0x41
V [libjvm.so+0x128b73e] Method::build_method_counters(Method*, Thread*)+0x3e
V [libjvm.so+0x128bd93] BreakpointInfo::set(Method*)+0x123
V [libjvm.so+0x106f066] JvmtiBreakpoint::each_method_version_do(void (Method::*)(int))+0x56
V [libjvm.so+0x173caf7] VM_Operation::evaluate()+0x187
V [libjvm.so+0x1760bdc] VMThread::inner_execute(VM_Operation*)+0x30c
V [libjvm.so+0x1761535] VMThread::loop()+0x255
V [libjvm.so+0x17617dc] VMThread::run()+0xcc
V [libjvm.so+0x166f066] Thread::call_run()+0xf6
V [libjvm.so+0x138a0f6] thread_native_entry(Thread*)+0x116
Attachments
Issue Links
- relates to
-
JDK-8282172 CompileBroker::log_metaspace_failure is called from non-Java/compiler threads
- Resolved