栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础之对象内存结构

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java基础之对象内存结构

图解

对象头

        MarkWord

                markword用于存储对象的运行时数据。记录分代年龄、锁标志位等。

                以下图片基于64位JVM

 

        类型指针

                指向方法区的类元数据,JVM通过这个指针确定对象是哪个类的实例。

        数组长度

                只有数组对象才有。

实例数据

        用于存储对象中的各字段信息。

对齐填充

        java对象都是都是按照8字节对齐的。对象占用的空间大小必须是8的倍数。这样的设计是为了加快对象的访问速度,让指针以每8个字节进行跳针。

指针压缩

        -XX:+UseCompressedOops是启用指针压缩,-XX:-UseCompressedOops是停用指针压缩。在64位JVM中指针压缩是默认开启的功能。

        如果不开启指针压缩,那么MarkWord与类型指针都将占用8个字节(64位),指针压缩会缩短类型指针的地址占用。

这样会带来的影响

        1.GC变得更加频繁:每个对象的占用空间变大,同一空间的可创建对象数量变小,更容易因为空间占用到达阈值而触发GC。

        2.降低CPU缓存命中率:CPU缓存的对象会变少,从而降低了使用的对象在CPU缓存中的概率。

示例

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;

public class LayoutTest1 {

    public static void main(String[] args) {
        System.out.println(VM.current().details());
        System.out.println(ClassLayout.parseClass(A.class).toPrintable());
        System.out.println(ClassLayout.parseClass(B.class).toPrintable());
        System.out.println(ClassLayout.parseInstance(new int[] {}).toPrintable());
    }
}

class A {
    long a;
}

class B {
    int a;
}

        不开启指针压缩得出的结果

开启指针压缩得出的结果

         通过对比两张图,我们可以发现仅从3个对象的内存占用情况来说,开启压缩指针减少了16字节的内存占用。

为什么JVM达到32G内存,压缩指针就失效了?

        当开启指针压缩后类型指针会被压缩到4个字节。那么类型指针的寻址极限就是4byte * 8bit = 32bit。类型指针可以存放2^32(4G)个内存单元地址。

        计算机中信息的最小单位是bit,存储单元的最小单位是byte。一个内存地址可以指向1byte的地址,所以最大内存就达到了32GB。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/705107.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号