RFR (M) 8249650: Optimize JNIHandle::make_local thread variable usage
David Holmes
david.holmes at oracle.com
Mon Jul 20 04:16:49 UTC 2020
Subject line got truncated by accident ...
On 20/07/2020 11:06 am, David Holmes wrote:
> Bug: https://bugs.openjdk.java.net/browse/JDK-8249650
> webrev: http://cr.openjdk.java.net/~dholmes/8249650/webrev/
>
> This is a simple cleanup that touches files across a number of VM areas
> - hence the cross-post.
>
> Whilst working on a different JNI fix I noticed that in most cases in
> jni.cpp we were using the following form of make_local:
>
> JNIHandles::make_local(env, obj);
>
> and what that form does is first extract the thread from the JNIEnv:
>
> JavaThread* thread = JavaThread::thread_from_jni_environment(env);
> return thread->active_handles()->allocate_handle(obj);
>
> but there is also another, faster, variant for when you already have the
> "thread":
>
> jobject JNIHandles::make_local(Thread* thread, oop obj) {
> return thread->active_handles()->allocate_handle(obj);
> }
>
> When you look at the JNI_ENTRY wrapper (and related JVM_ENTRY, WB_ENTRY,
> UNSAFE_ENTRY etc) it has already extracted the thread from the JNIEnv:
>
> JavaThread* thread=JavaThread::thread_from_jni_environment(env);
>
> and further defined:
>
> Thread* THREAD = thread;
>
> so we always already have direct access to the "thread" available (or
> indirect via TRAPS), and in fact we can end up removing the
> make_local(JNIEnv* env, oop obj) variant altogether.
>
> Along the way I spotted some related issues with unnecessary use of
> Thread::current() when it is already available from TRAPS, and some
> other cases where we extracted the JNIEnv from a thread only to later
> extract the thread from the JNIEnv.
>
> Testing: tiers 1 - 3
>
> Thanks,
> David
> -----
More information about the serviceability-dev
mailing list