RFR: 8242440: use separate, destroyable JavaVM instances per libgraal compiler thread

Doug Simon dnsimon at openjdk.java.net
Sun Apr 17 09:07:40 UTC 2022


On Sun, 17 Apr 2022 05:22:09 GMT, Kim Barrett <kbarrett at openjdk.org> wrote:

>> Currently, libgraal runs in a single, permanent JavaVM instance loaded from libjvmcicompiler.so. This poses 2 problems:
>> 
>> 1. The memory used for libgraal is never released, even when the libgraal compiler queues are idle.
>> 2. Since all libgraal HotSpot compiler threads share the same SVM heap, libgraal compilation is effectively paused when a GC occurs (SVM currently has a stop the world collector). The more compiler threads there are, the more often this happens.
>> 
>> This PR implements the following solution to these problems:
>> 1. Create a new JavaVM instance per libgraal compiler thread (i.e. a separate SVM isolate per thread). This prevents GC in one libgraal thread from impacting another libgraal thread.
>> 2. Destroy the JavaVM instances when a libgraal compiler thread becomes idle and create a new one when subsequent compilation requests arrive.
>> 
>> Most of the changes are in JVMCI specific files. The most significant change to shared code is the addition of the `JavaThread:: _libjvmci_runtime` field. This is required as any thread (not just a `CompilerThread`) can be associated with a specific `JVMCIRuntime` object.
>
> src/hotspot/share/jvmci/jvmciRuntime.cpp line 1185:
> 
>> 1183: JNIEnv* JVMCIRuntime::init_shared_library_javavm() {
>> 1184:   MutexLocker locker(_lock);
>> 1185:   JavaVM* javaVM = (JavaVM*) _shared_library_javavm;
> 
> Pointless cast.

Without that cast, I get this compiler error:

-------------

PR: https://git.openjdk.java.net/jdk/pull/8262


More information about the hotspot-dev mailing list