RFR: 8276662: Scalability bottleneck in SymbolTable::lookup_common() [v3]

Derek White drwhite at openjdk.java.net
Fri Nov 19 18:59:47 UTC 2021


> Symbol table lookup had an optimization added when the symbol table was split into a shared table (for CDS?) and a local table. The optimization tries to track which table successfully found a symbol, so it can try that table first the next time.
> 
> Symbol table lookup is used in many JVM operations, including classloading, serialization, and reflection.
> 
> At startup time, more symbols will be from the shared table, but over time lookup can will be from a mix of local and shared symbols (eg user classes still have java.lang.String fields or subclass from java.lang.Object), resulting in multiple threads fighting over the value of this global variable.
> 
> With enough threads and cores, this can result in "true sharing" cache line contention.
> 
> This fix solves the scalability issue by using a thread-local variable to track which table to search first instead of a static global. The "symbol table success history" also makes more sense logically as a thread local state than as a global state.
> 
> Other options would also solve the the scaling problem, but may change the behavior that we're trying to optimize, or add more overhead or complexity than warranted, such as:
> - Statically preferring the shared or local table
> - Checking the shared table first "early on". When enough local symbols have been added, then check the local table first.  
> - Using a NUMA-aware set of N variables distributed over M threads.

Derek White has updated the pull request incrementally with one additional commit since the last revision:

  Add motivating comment for THREAD_LOCAL

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/6400/files
  - new: https://git.openjdk.java.net/jdk/pull/6400/files/7baf3fd4..3558568e

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=6400&range=02
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=6400&range=01-02

  Stats: 2 lines in 1 file changed: 2 ins; 0 del; 0 mod
  Patch: https://git.openjdk.java.net/jdk/pull/6400.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/6400/head:pull/6400

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


More information about the hotspot-runtime-dev mailing list