JVM——》Java对象内存模型

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】

JVM——》Java对象内存模型

  • 一、Java对象内存模型
    • Mark Word在HotSpot的实现
  • 二、Java对象内存大小
    • 1、引入pom
    • 2、Object对象测试
    • 3、int类型对象测试
    • 4、自定义对象测试

一、Java对象内存模型

Java对象内存模型.png

Mark Word在HotSpot的实现

JVM——》Java对象内存模型_第1张图片

Q:Class Point开启压缩后只占用4字节,为什么可以支持32G寻址(正常只能支持4G的寻址)?
A:因为对象的对齐填充。
所有对象开头的位置,必须是8n的位置,所以寻址时,从0到8到16到24~
按照之前8倍的方式去找对象,寻址范围自然是之前的8倍。

二、Java对象内存大小

1、引入pom

<dependency>
	<groupId>org.openjdk.jolgroupId>
	<artifactId>jol-coreartifactId>
	<version>0.9version>
dependency>

2、Object对象测试

package com.xiaoxian.demo;

import org.openjdk.jol.info.ClassLayout;

public class ObjectTest {
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
    }
}

JVM——》Java对象内存模型_第2张图片

Java对象内存 占用字节数 描述
对象头 12 MarkWord:占8字节
ClassPointer:占4字节(因为开启UseCompressedClassPointers指针压缩,所以8个字节压缩成4个字节)
实例数据 0
对齐填充 4 当整体的字节数不能被8整除的时候,则会补到能被8整除的字节数

Q:为什么ClassPointer占4字节?
A:一般来说,JVM是64位系统,它的指针就应该是8个字节大小,但是由于它默认开启了UseCompressedClassPointers,也就是指针压缩,就会把这8个字节压缩成4个字节。

执行java命令:java -XX:+PrintCommandLineFlags -version
JVM——》Java对象内存模型_第3张图片

3、int类型对象测试

package com.xiaoxian.demo;

import org.openjdk.jol.info.ClassLayout;

public class IntTest {
    public static void main(String[] args) {
        int  i = 0;
        System.out.println(ClassLayout.parseInstance(i).toPrintable());
    }
}

JVM——》Java对象内存模型_第4张图片

Java对象内存 占用字节数 描述
对象头 12 MarkWord:占8字节
ClassPointer:占4字节(因为开启UseCompressedClassPointers指针压缩,所以8个字节压缩成4个字节)
实例数据 4
对齐填充 0 当整体的字节数能被8整除的时候,不需要对齐

4、自定义对象测试

package com.xiaoxian.demo;


import lombok.Data;
import org.openjdk.jol.info.ClassLayout;

public class MyObjectTest {
    public static void main(String[] args) {
        User user = new User();
        user.setObject(new Object());
        System.out.println(ClassLayout.parseInstance(user).toPrintable());
    }
}

@Data
class User {
    int age;
    String name;
    Object object;
}

JVM——》Java对象内存模型_第5张图片

Java对象内存 占用字节数 描述
对象头 12 MarkWord:占8字节
ClassPointer:占4字节(因为开启UseCompressedClassPointers指针压缩,所以8个字节压缩成4个字节)
实例数据 12
对齐填充 0 当整体的字节数能被8整除的时候,不需要对齐

你可能感兴趣的:(JVM,Java,java,对象,内存,MarkWord,ClassPointer)