RFR: 8261449: Micro-optimize JVM_LatestUserDefinedLoader [v2]

Aleksey Shipilev shade at openjdk.java.net
Wed Feb 10 07:34:59 UTC 2021


> `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


More information about the core-libs-dev mailing list