[英]UseCompressedOops UseCompressedClassPointers in jdk-13 and jdk-15
Accidentally I have stumbled into a change in jdk-15
that I was not aware of.意外地,我偶然发现了
jdk-15
的一个我不知道的变化。 Suppose I have a very simple question: what is the size of an array of 3 intergers?假设我有一个非常简单的问题:3 个整数数组的大小是多少? For this, I use JOL .
为此,我使用JOL 。 The code is fairly trivial:
代码相当简单:
import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;
public class Array {
public static void main(String [] args){
int [] array = new int[3];
System.out.println(ClassLayout.parseInstance(array).toPrintable());
}
}
I run this with jdk-13
:我用
jdk-13
运行它:
java -Djdk.attach.allowAttachSelf -Djol.tryWithSudo=true -cp jol-cli.jar Array.java
I get the output:我得到 output:
[I 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) 18 0e 07 00 (00011000 00001110 00000111 00000000) (462360)
12 4 (object header) 03 00 00 00 (00000011 00000000 00000000 00000000) (3)
16 12 int [I.<elements> N/A
28 4 (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
This is pretty much obvious:这很明显:
12 bytes --> Object headers
4 bytes --> size of array
12 bytes --> elements of array themselves
4 bytes --> padding to align by 8 bytes
----
32 bytes total
Running this example with jdk-15
yields the same output, same 32 bytes
.使用
jdk-15
运行此示例会产生相同的 output, same 32 bytes
。 Expected...预期的...
For the second part, I want to disable a JVM optimization: -XX:-UseCompressedOops
.对于第二部分,我想禁用 JVM 优化:
-XX:-UseCompressedOops
。 I run this with jdk-13
:我用
jdk-13
运行它:
java -Djdk.attach.allowAttachSelf -Djol.tryWithSudo=true -cp jol-cli.jar -XX:-UseCompressedOops Array.java
[I object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 11 00 00 00 (00010001 00000000 00000000 00000000) (17)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 40 0c f0 33 (01000000 00001100 11110000 00110011) (871369792)
12 4 (object header) 02 00 00 00 (00000010 00000000 00000000 00000000) (2)
16 4 (object header) 03 00 00 00 (00000011 00000000 00000000 00000000) (3)
20 4 (alignment/padding gap)
24 12 int [I.<elements> N/A
36 4 (loss due to the next object alignment)
Instance size: 40 bytes
Space losses: 4 bytes internal + 4 bytes external = 8 bytes total
Well, sort of expected too:好吧,也有点预期:
16 bytes --> object headers (I did -XX:-UseCompressedOops after all)
4 bytes --> array size
4 bytes --> alignment for array headers (AFAIK this is only done for arrays)
12 bytes --> array elements themselves
4 bytes --> 4 bytes padding
----
40 bytes total
Now let's run the same example with jdk-15
:现在让我们使用
jdk-15
运行相同的示例:
[I 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) 0e 09 00 00 (00001110 00001001 00000000 00000000) (2318)
12 4 (object header) 03 00 00 00 (00000011 00000000 00000000 00000000) (3)
16 12 int [I.<elements> N/A
28 4 (loss due to the next object alignment)
Instance size: 32 bytes
Why is this 32 bytes
now?为什么现在是
32 bytes
? How come not 40
, just like with jdk-13
?为什么不是
40
,就像jdk-13
一样?
In both jdk-13
and jdk-15
, both of these options are on by default:在
jdk-13
和jdk-15
中,默认情况下这两个选项都是打开的:
java -XX:+PrintFlagsFinal -version | grep Compressed
bool UseCompressedClassPointers = true
bool UseCompressedOops = true
When -XX:-UseCompressedOops
is disabled, it means that UseCompressedClassPointers
is disabled also.当
-XX:-UseCompressedOops
被禁用时,意味着UseCompressedClassPointers
也被禁用。 That is why when UseCompressedOops
is turned off, the header size goes up by 4 bytes
, because UseCompressedOops
turns off UseCompressedClassPointers
.这就是为什么当
UseCompressedOops
关闭时,header 大小增加了4 bytes
,因为UseCompressedOops
关闭了UseCompressedClassPointers
。 At least this is how it is in jdk-13
:至少在
jdk-13
中是这样的:
java -XX:+PrintFlagsFinal -XX:-UseCompressedOops -version | grep Compressed
bool UseCompressedClassPointers = false
bool UseCompressedOops = false
Things have changed in jdk-15
: jdk-15
中的情况发生了变化:
bool UseCompressedClassPointers = true
bool UseCompressedOops = false
So disabling UseCompressedOops
does not mean that UseCompressedClassPointers
is disabled also, so it stays at 4 bytes
.所以禁用
UseCompressedOops
并不意味着UseCompressedClassPointers
也被禁用,所以它保持在4 bytes
。
Though, I answered this myself, it would be nice if someone finds the relevant bug/change for this?虽然,我自己回答了这个问题,但如果有人找到相关的错误/更改会很好吗? I have not been successful in that, so far.
到目前为止,我还没有成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.