RFR: CODETOOLS-7902931: JOL: Rework magic field offset accessor [v4]
Zheka Kozlov
github.com+761899+orionll at openjdk.java.net
Tue May 11 10:50:03 UTC 2021
On Tue, 11 May 2021 06:38:26 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:
>> See the bug report for discussion.
>>
>> Basic sanity test:
>>
>>
>> $ cat MyRecord.java
>> record MyRecord(int x, int y) {}
>>
>>
>> Current JDK 17 EA, out-of-box:
>>
>>
>> $ 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
>>
>>
>> Current JDK 17 EA, with `-Djol.magicFieldOffset=true`:
>>
>>
>> $ 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
>
> Aleksey Shipilev has updated the pull request incrementally with one additional commit since the last revision:
>
> Simplify the verification loop
jol-core/src/main/java/org/openjdk/jol/vm/HotspotUnsafe.java line 58:
> 56:
> 57: private static final boolean MAGIC_FIELD_OFFSET =
> 58: Boolean.parseBoolean(System.getProperty(MAGIC_FIELD_OFFSET_OPTION, "false"));
Can be replaced with `Boolean.getBoolean(MAGIC_FIELD_OFFSET_OPTION)`
-------------
PR: https://git.openjdk.java.net/jol/pull/16
More information about the jol-dev
mailing list