「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
堆
堆内存作为JVM内存模型中占比最大的空间它的重要性显而易见。下文的对象创建和GC算法、GC收集器都和堆内存息息相关。我们程序中几乎所有(不是全部)对象都存放在堆内存中,堆内存也是支持动态伸缩,当申请不了更多的可用内存时便会抛出OOM。我们可以通过JVM启动参数对其设置内存大小:
-Xms 堆的最小内存,例 -Xms512m
-Xmx 堆的最大内存
-Xmn 堆的新生代大小
-XX:NewSize 新生代最小值
-XX:MaxNewSize 新生代最大值
注意:
Java堆内存 规整:已使用的内存在一边,未使用内存在另一边Java堆内存 不规整:已使用的内存和未使用内存相互交错
对象的内存布局
一个对象在堆内存中的内存布局可以分三块
- 对象头:1.存储对象在运行时的数据,比如
哈希码、GC分代年龄、锁状态标志、偏向线程ID等等,这部分区域称之为Mark Word。2.类型指针:JVM通过这个指针来确定此对象属于哪个类的实例。3.如果对象是一个数组,还会存储数组的长度信息。 - 实例数据:存放的就是我们代码定义的实例变量所对应的数据和父类继承下来的实例变量,实例数据的顺序受我们编码顺序相关。
- 对齐填充:没有特殊的含义,仅是为了起到占位符的作用。JVM管理对象,对象的大小必须是8字节的整数倍,方便管理,如果对象的大小不是8的整数倍就需要对齐填充之最近的8整数倍。