Add compact-strings module: Compact Strings (JEP 254) measured with JOL on JDK 25, with and without -XX:-CompactStrings, and compact object headers on 25 vs 27
Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01KqJyCidz3ZgRyHABv2GVJh
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
$ java -XX:+UseCompactObjectHeaders StringLayout (JDK 25)
|
||||
java.version = 25.0.4.1
|
||||
vm.flags = -XX:+EnableDynamicAgentLoading -XX:+UseCompactObjectHeaders
|
||||
# Field sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8
|
||||
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8
|
||||
|
||||
=== java.lang.String, the class
|
||||
java.lang.String object internals:
|
||||
OFF SZ TYPE DESCRIPTION VALUE
|
||||
0 8 (object header: mark) N/A
|
||||
8 4 int String.hash N/A
|
||||
12 1 byte String.coder N/A
|
||||
13 1 boolean String.hashIsZero N/A
|
||||
14 2 (alignment/padding gap)
|
||||
16 4 byte[] String.value N/A
|
||||
20 4 (object alignment gap)
|
||||
Instance size: 24 bytes
|
||||
Space losses: 2 bytes internal + 4 bytes external = 6 bytes total
|
||||
|
||||
=== one Latin-1 string and one UTF-16 string, field by field
|
||||
java.lang.String object internals:
|
||||
OFF SZ TYPE DESCRIPTION VALUE
|
||||
0 8 (object header: mark) 0x0017940000000001 (Lilliput)
|
||||
8 4 int String.hash 0
|
||||
12 1 byte String.coder 0
|
||||
13 1 boolean String.hashIsZero false
|
||||
14 2 (alignment/padding gap)
|
||||
16 4 byte[] String.value [104, 101, 108, 108, 111]
|
||||
20 4 (object alignment gap)
|
||||
Instance size: 24 bytes
|
||||
Space losses: 2 bytes internal + 4 bytes external = 6 bytes total
|
||||
|
||||
java.lang.String object internals:
|
||||
OFF SZ TYPE DESCRIPTION VALUE
|
||||
0 8 (object header: mark) 0x0017940000000001 (Lilliput)
|
||||
8 4 int String.hash 0
|
||||
12 1 byte String.coder 1
|
||||
13 1 boolean String.hashIsZero false
|
||||
14 2 (alignment/padding gap)
|
||||
16 4 byte[] String.value [104, 0, -84, 32, 108, 0, 108, 0, 111, 0]
|
||||
20 4 (object alignment gap)
|
||||
Instance size: 24 bytes
|
||||
Space losses: 2 bytes internal + 4 bytes external = 6 bytes total
|
||||
|
||||
=== the byte[] behind each
|
||||
[B object internals:
|
||||
OFF SZ TYPE DESCRIPTION VALUE
|
||||
0 8 (object header: mark) 0x00174c0000000001 (Lilliput)
|
||||
8 4 (array length) 5
|
||||
12 5 byte [B.<elements> N/A
|
||||
17 7 (object alignment gap)
|
||||
Instance size: 24 bytes
|
||||
Space losses: 0 bytes internal + 7 bytes external = 7 bytes total
|
||||
|
||||
[B object internals:
|
||||
OFF SZ TYPE DESCRIPTION VALUE
|
||||
0 8 (object header: mark) 0x00174c0000000001 (Lilliput)
|
||||
8 4 (array length) 10
|
||||
12 10 byte [B.<elements> N/A
|
||||
22 2 (object alignment gap)
|
||||
Instance size: 24 bytes
|
||||
Space losses: 0 bytes internal + 2 bytes external = 2 bytes total
|
||||
|
||||
=== footprint by length (String object + its byte[], via GraphLayout)
|
||||
chars content coder byte[].length String byte[] total
|
||||
0 ASCII 0 0 24 16 40
|
||||
0 U+00E9 0 0 24 16 40
|
||||
0 U+20AC 0 0 24 16 40
|
||||
1 ASCII 0 1 24 16 40
|
||||
1 U+00E9 0 1 24 16 40
|
||||
1 U+20AC 1 2 24 16 40
|
||||
5 ASCII 0 5 24 24 48
|
||||
5 U+00E9 0 5 24 24 48
|
||||
5 U+20AC 1 10 24 24 48
|
||||
10 ASCII 0 10 24 24 48
|
||||
10 U+00E9 0 10 24 24 48
|
||||
10 U+20AC 1 20 24 32 56
|
||||
20 ASCII 0 20 24 32 56
|
||||
20 U+00E9 0 20 24 32 56
|
||||
20 U+20AC 1 40 24 56 80
|
||||
40 ASCII 0 40 24 56 80
|
||||
40 U+00E9 0 40 24 56 80
|
||||
40 U+20AC 1 80 24 96 120
|
||||
100 ASCII 0 100 24 112 136
|
||||
100 U+00E9 0 100 24 112 136
|
||||
100 U+20AC 1 200 24 216 240
|
||||
1000 ASCII 0 1000 24 1016 1040
|
||||
1000 U+00E9 0 1000 24 1016 1040
|
||||
1000 U+20AC 1 2000 24 2016 2040
|
||||
Reference in New Issue
Block a user