> `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`
Aleksey Shipilev has updated the pull request incrementally with one additional commit since the last revision: Added a comment ------------- Changes: - all: https://git.openjdk.java.net/jdk/pull/2485/files - new: https://git.openjdk.java.net/jdk/pull/2485/files/fc333037..72e830a8 Webrevs: - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2485&range=01 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2485&range=00-01 Stats: 1 line in 1 file changed: 1 ins; 0 del; 0 mod Patch: https://git.openjdk.java.net/jdk/pull/2485.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/2485/head:pull/2485 PR: https://git.openjdk.java.net/jdk/pull/2485