前言
在网上大家很多都看到过这样一句话:“JVM内存最好不要超过32G”。
今天我们就来分析一下为什么?32G到底是怎么算出来的。
JAVA对象模型
我们先了解一下,一个JAVA对象的存储结构。在Hotspot虚拟机中,对象在内存中的存储布局分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
1、对象头(Header)
对象头,又包括三部分:MarkWord、元数据指针、数组长度。
下面图是64位系统下的对象头布局
MarkWord:用于存储对象运行时的数据,比如HashCode、锁状态标志、GC分代年龄等。这部分在64位操作系统下,占8字节(64bit),在32位操作系统下,占4字节(32bit)。
具体的作用可以参考我之前写的synchronized锁原理分析(一、从Java对象头看synchronized锁的状态)
指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
这部分就涉及到一个指针压缩的概念,在开启指针压缩的情况下,占4字节(32bit),未开启情况下,占8字节(64bit),现在JVM在1.6之后,在64位操作系统下都是默认开启的。
数组长度:这部分只有是数组对象才有