JDK-8307350 : -XX:ContendedPaddingWidth=256 has no effect on the padding us the Thread class
  • Type: Bug
  • Component: hotspot
  • Sub-Component: runtime
  • Affected Version: 17.0.7
  • Priority: P3
  • Status: Resolved
  • Resolution: Incomplete
  • OS: generic
  • CPU: generic
  • Submitted: 2023-04-28
  • Updated: 2023-05-03
  • Resolved: 2023-05-03
Description
A DESCRIPTION OF THE PROBLEM :
When using -XX:ContendedPaddingWidth=256 the argument has no effect on the padding of the Thread and ConcurrentHashMap$CounterCell class.

No impact on the tlr contended group using in Thread for the threadLocalRandomSeed, threadLocalRandomProbe and threadLocalRandomSecondarySeed
If I use Unsafe to print the field offsets what I get is:

Memory layout for: java.lang.Thread
field=priority, offset=12, field type=int
field=eetop, offset=16, field type=long
field=stackSize, offset=24, field type=long
field=tid, offset=32, field type=long
field=threadStatus, offset=40, field type=int
field=daemon, offset=44, field type=boolean
field=interrupted, offset=45, field type=boolean
field=stillborn, offset=46, field type=boolean
field=name, offset=48, field type=java.lang.String
field=target, offset=52, field type=java.lang.Runnable
field=group, offset=56, field type=java.lang.ThreadGroup
field=contextClassLoader, offset=60, field type=java.lang.ClassLoader
field=inheritedAccessControlContext, offset=64, field type=java.security.AccessControlContext
field=threadLocals, offset=68, field type=java.lang.ThreadLocal$ThreadLocalMap
field=inheritableThreadLocals, offset=72, field type=java.lang.ThreadLocal$ThreadLocalMap
field=parkBlocker, offset=76, field type=java.lang.Object
field=blocker, offset=80, field type=sun.nio.ch.Interruptible
field=blockerLock, offset=84, field type=java.lang.Object
field=uncaughtExceptionHandler, offset=88, field type=java.lang.Thread$UncaughtExceptionHandler
field=threadLocalRandomSeed, offset=224, field type=long
field=threadLocalRandomProbe, offset=232, field type=int
field=threadLocalRandomSecondarySeed, offset=236, field type=int

We can see that threadLocalRandomSeed offest is 224 which means: 88 (uncaughtExceptionHandler offset) + 4 (reference size) + 4 (block alignment) + 128 (contended padding)
I believe that the same problem can happen with ConcurrentHashMap$CounterCell but weirdly not with Striped64$Cell.

I did not observe that problem on Java 8 and 11

REGRESSION : Last worked in version 11.0.19

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
* Start the JVM with -XX:ContendedPaddingWidth=256
* Instantiate a Thread class
* Look at the field offsets

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The padding surrounding the the threadLocalRandomSeed, threadLocalRandomProbe and threadLocalRandomSecondarySeed fields should be 256 before and 256 after.
ACTUAL -
The padding stay 128 which is the default value

FREQUENCY : always



Comments
additional information requested from submitter: ====================================== To understand the issue better could you please provide a standalone testcase or steps to reproduce this issue? ======================================
03-05-2023