RFR: 8256477: Specialize heap memory segment implementations

Maurizio Cimadamore mcimadamore at openjdk.java.net
Tue Nov 17 14:59:07 UTC 2020


The current memory segment implementation defines a hierarchy with 3 concrete classes: one for heap segments, one for native segments and one for mapped segments.

Since there can be many kinds of heap segments (e.g. created from a byte[] or from a float[]) the current implementation is prone to type profile pollution problems: if enough heap segments are created (of different kinds), the JIT compiler will give up on speculating on the heap segment kind, which will then result in poor performances.

This issue can be reproduced in one of the existing benchmark, by adding some initialization code which is enough to pollute the types profiles. When that happens, performance numbers look like the following:

Benchmark                             (polluteProfile)  Mode  Cnt  Score   Error  Units
LoopOverNonConstantHeap.segment_loop             false  avgt   10  0.285 ± 0.003  ms/op
LoopOverNonConstantHeap.segment_loop              true  avgt   10  5.540 ± 0.143  ms/op

(Thanks to Vlad for coming up for the exact incantation which leads to profile pollution :-) )

The solution is to create a sharp subclass for each heap segment case. With this, C2 has always a sharp Unsafe *base* to work with, and performances are stable regardless of profile pollution attempts.

This patch also tweaks the benchmark for heap segments so that it checks it with and without profile pollution.

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

Commit messages:
 - Tweak code so that specialized classes define their own factories
 - make base() method abstract in HeapMemorySegmentImpl
 - Create specialized subclasses for all the heap segment cases

Changes: https://git.openjdk.java.net/jdk/pull/1259/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=1259&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8256477
  Stats: 187 lines in 4 files changed: 140 ins; 4 del; 43 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1259.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1259/head:pull/1259

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


More information about the core-libs-dev mailing list