简体   繁体   English

UseCompressedOops UseCompressedClassPointers 在 jdk-13 和 jdk-15

[英]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-13jdk-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM