RFR: 8261449: Micro-optimize JVM_LatestUserDefinedLoader

David Holmes dholmes at openjdk.java.net
Wed Feb 10 01:42:39 UTC 2021


On Tue, 9 Feb 2021 15:40:03 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

> `JVM_LatestUserDefinedLoader` is called normally from `ObjectInputStream.resolveClass` -> `VM.latestUserDefinedLoader0`. And it takes a measurable time to walk the stack. There is JDK-8173368 that wants to replace it with `StackWalker`, but we can tune up the `JVM_LatestUserDefinedLoader` itself without changing the semantics of it (thus providing the backportability, including the releases that do not have `StackWalker`) and improving performance (thus providing a more aggressive baseline for `StackWalker` rewrite).
> 
> The key is to recognize that out of two checks: 1) checking for two special subclasses; 2) checking for user classloader -- the first one usually passes, and second one fails much more frequently. First check also requires traversing the superclasses upwards looking for match. Reversing the order of the checks, plus inlining the helper method improves performance without changing the semantics.
> 
> Out of curiosity, my previous patch dropped the first check completely, replacing it by asserts, and we definitely run into situation where that check is needed on some tests.
> 
> On my machine, `VM.latestUserDefinedLoader` invocation time drops from 115 to 100 ns/op. Single-threaded SPECjvm2008:serial improves about 3% with this patch.
> 
> Additional testing:
>  - [x] Ad-hoc benchmarks
>  - [x] Linux x86_64 fastdebug, `tier1`, `tier2`, `tier3` 
> 
> ---------
> ### Progress
> - [x] Change must not contain extraneous whitespace
> - [x] Commit message must refer to an issue
> - [ ] Change must be properly reviewed
> 
> 
> 
> ### Download
> `$ git fetch https://git.openjdk.java.net/jdk pull/2485/head:pull/2485`
> `$ git checkout pull/2485`

Hi Aleksey,

This seems reasonable to me. The generated reflection classes are loaded by a temporary loader (so they can be unloaded) and so have to be skipped.

I've added core-libs to the PR as this is the VM side of their code and I want to make sure nothing has been overlooked.

Thanks,
David

src/hotspot/share/prims/jvm.cpp line 3293:

> 3291:     oop loader = ik->class_loader();
> 3292:     if (loader != NULL && !SystemDictionary::is_platform_class_loader(loader)) {
> 3293:       if (!ik->is_subclass_of(vmClasses::reflect_MethodAccessorImpl_klass()) &&

Please add a comment:
// Skip reflection related frames

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

Marked as reviewed by dholmes (Reviewer).

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


More information about the core-libs-dev mailing list