Maven pom.xml

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.10</version>
</dependency>

Java类:

public class MyObjectData {

    private  int i=66;
    private  long l=6L;
    private String string=new String("aaaa");

}

public class ObjectTest {

    @Test
    public  void test1() {
        Layouter l;
        //64 bit vm object distribution, pointer compression not enabled
        l = new HotSpotLayouter(new X86_64_DataModel());
        System.out.println("***** " + l);
        System.out.println(ClassLayout.parseInstance(new MyObjectData(),l).toPrintable());
        System.out.println("==============================================");
    }

}

运行结果:

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)                           01 23 01 f8 (00000001 00100011 00000001 11111000) (-134143231)
     12     4                    (object header)                           42 00 00 00 (01000010 00000000 00000000 00000000) (66)
     16     8               long MyObjectData.l                            6
     24     4                int MyObjectData.i                            66
     28     4                    (alignment/padding gap)
     32     8   java.lang.String MyObjectData.string                       (object)
     40    -8                    (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 4 bytes internal + -8 bytes external = -4 bytes total`

我不明白为什么64位VM在判断对象的内存使用情况时没有开始指针压缩,从而导致-8内存对齐.

推荐答案

我不明白为什么64位VM在判断对象的内存使用时没有开始指针压缩...

JVM不会动态启动指针压缩;例如"... did not 100 pointer compression 101..."

相反,它决定在(64位)JVM启动时是否使用压缩的OOP.它根据命令行选项(即UseCompressedOopsObjectAlignmentInBytes和最大堆大小)来决定.最大堆大小由-xmx给出,或由特定于平台的默认算法确定.

所以..您需要查看JVM的(实际和默认)JVM选项,以找出压缩的OOP(显然)无效的原因.用-XX:+PrintCommandLineFlags来找出答案.

Java相关问答推荐

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

如何在Java中从XML中获取特定的 node ,然后将其删除?

无法使用Java&;TestContainers获取AWS SQS队列的属性

Android Studio模拟器没有互联网

在使用具有不同成本的谓词调用allMatch之前对Java流进行排序会带来什么好处吗?

如何对存储为字符串的大数字数组进行排序?

我们可以在方法中声明接口吗?

使用同步方法中的新线程调用同步方法

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

如何使JOOQ渐变脚本不重新创建表未更改的类?

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

如何在更改分辨率时将鼠标坐标计算为世界坐标

JavaFX中ListView中的问题

在JSON上获取反斜杠

移动二维数组的行

在对象列表上调用提取后,如何判断没有值为空?

找到差异最小的回文