所以,我試圖運行一些簡單的代碼,JDK-8,輸出通過約爾java8 -XX:+ UseCompressedOops -XX:ObjectAlignmentInBytes = 16
System.out.println(VMSupport.vmDetails());
Integer i = new Integer(23);
System.out.println(ClassLayout.parseInstance(i)
.toPrintable());
第一次嘗試與運行在64位JVM上也禁用壓縮的oops和壓縮klass。
-XX:-UseCompressedOops -XX:-UseCompressedClassPointers
輸出,幾乎預期是:
Running 64-bit HotSpot VM.
Objects are 8 bytes aligned.
java.lang.Integer object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 48 33 36 97 (01001000 00110011 00110110 10010111) (-1758055608)
12 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
16 4 int Integer.value 23
20 4 (loss due to the next object alignment)
Instance size: 24 bytes (reported by Instrumentation API)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
這是有道理的:8個字節克拉斯字+ 8字節標記字+ 4個字節的實際值和4填充(對齊在8個字節上)= 24個字節。
第二次嘗試在64位JVM上使用壓縮的oops啓用壓縮的klass。
同樣,輸出是非常理解的:
Running 64-bit HotSpot VM.
Using compressed oop with 3-bit shift.
Using compressed klass with 3-bit shift.
Objects are 8 bytes aligned.
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) f9 33 01 f8 (11111001 00110011 00000001 11111000) (-134138887)
12 4 int Dummy.i 42
Instance size: 16 bytes (reported by Instrumentation API).
4字節的壓縮接力(克拉斯字)+ 8個字節標記字+ 4個爲值+沒有空間損耗= 16個字節字節。
是沒有意義對我來說,事情是這樣的用例:
-XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:ObjectAlignmentInBytes=16
輸出是這樣的:
Running 64-bit HotSpot VM.
Using compressed oop with 4-bit shift.
Using compressed klass with 0x0000001000000000 base address and 0-bit shift.
我真的很期待都爲「4位移「。他們爲什麼不是?
編輯 第二個例子是與運行:
XX:+UseCompressedOops -XX:+UseCompressedClassPointers
,第三個用:
-XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:ObjectAlignmentInBytes=16
迷人!非常清楚。 – Eugene