RFR: CODETOOLS-7902931: JOL: Rework magic field offset accessor

Aleksey Shipilev shade at openjdk.java.net
Mon May 10 18:09:24 UTC 2021


See the bug report for discussion.

Current JDK 17 EA:


$ cat MyRecord.java
record MyRecord(int x, int y) {}

$ java -jar jol-cli/target/jol-cli.jar internals -cp . MyRecord
...

java.lang.RuntimeException: Cannot get the field offset, try with -Djol.magicFieldOffset=true
	at org.openjdk.jol.vm.HotspotUnsafe.fieldOffset(HotspotUnsafe.java:455)
	at org.openjdk.jol.layouters.CurrentLayouter.layout(CurrentLayouter.java:70)
	at org.openjdk.jol.info.ClassLayout.parseInstance(ClassLayout.java:102)
	at org.openjdk.jol.info.ClassLayout.parseInstance(ClassLayout.java:85)
	at org.openjdk.jol.operations.ObjectInternals.runWith(ObjectInternals.java:51)
	at org.openjdk.jol.operations.ClasspathedOperation.run(ClasspathedOperation.java:76)
	at org.openjdk.jol.Main.main(Main.java:58)
Caused by: java.lang.UnsupportedOperationException: can't get field offset on a record class: private final int MyRecord.x
	at jdk.unsupported/sun.misc.Unsafe.objectFieldOffset(Unsafe.java:648)
	at org.openjdk.jol.vm.HotspotUnsafe.fieldOffset(HotspotUnsafe.java:448)
	... 6 more

$ java -Djol.magicFieldOffset=true -jar jol-cli/target/jol-cli.jar internals -cp . MyRecord
...

MyRecord object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4        (object header: class)    0x00218180
 12   4    int MyRecord.x                0
 16   4    int MyRecord.y                0
 20   4        (object alignment gap)    
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

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

Commit messages:
 - Rework magic field offset

Changes: https://git.openjdk.java.net/jol/pull/16/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jol&pr=16&range=00
  Issue: https://bugs.openjdk.java.net/browse/CODETOOLS-7902931
  Stats: 235 lines in 2 files changed: 106 ins; 121 del; 8 mod
  Patch: https://git.openjdk.java.net/jol/pull/16.diff
  Fetch: git fetch https://git.openjdk.java.net/jol pull/16/head:pull/16

PR: https://git.openjdk.java.net/jol/pull/16


More information about the jol-dev mailing list