总结分享 | JVM堆内存结构
- 堆是Java虚拟机所管理的内存中最大的一块存储区域。
- 堆内存被所有线程共享。
- 主要存放使用new关键字创建的对象。
- 所有对象实例以及数组都要在堆上分配。
- 垃圾收集器就是根据GC算法,收集堆上对象所占用的内存空间(收集的是对象占用的空间而不是对象本身)。
JDK1.7 堆内存结构
- 年轻代(Young Generation)和老年代(Old Generation);
- 年轻代又分为:伊甸园(Eden)和幸存者区(Survivor区);
- 幸存区又分为:From Survivor (S0)空间和 To Survivor (S1))空间。
- 永久区(Permanent Space)
JDK1.8 堆内存结构
- 年轻代(Young Generation)和老年代(Old Generation);
- 年轻代又分为:伊甸园(Eden)和幸存者区(Survivor区);
- 幸存区又分为:From Survivor (S0)空间和 To Survivor (S1))空间。
S0和S1大小相等
新创建的对象都在年轻代
经过年轻代多次垃圾回收存活下来的对象存在老年代中
Jdk1.7 和 Jdk1.8 的区别在于, 1.8 将永久代中的对象放到了元数据区, 不存永久代这一区域了
年轻代与老年代
JVM堆中存储的Java对象可以被划分为两类:
- 生命周期较短的瞬时对象,这些对象的创建和消亡都非常迅速。
- 生命周期非常长的对象,在某些极端的情况下能够与JVM的生命周期保持一致。
JVM堆空间被细分为年轻代(Young Gen)和老年代(Old Gen)。其中年轻代又被划分为Eden区、Survivor 0区和
Surivior 1区,其中Survivor 0区和Surivior 1区由于会进行交换,在宏观上是一种相对而言的区域,所以又被称为from区和to区。
JVM 内存参数
堆内存,按大小设置
解释:
- -Xms 最小堆内存(包括新生代和老年代)
- -Xmx 最大对内存(包括新生代和老年代)
- 通常建议将 -Xms 与 -Xmx 设置为大小相等,即不需要保留内存,不需要从小到大增长,这样性能较好
- -XX:NewSize 与 -XX:MaxNewSize 设置新生代的最小与最大值,但一般不建议设置,由 JVM 自己控制
- -Xmn 设置新生代大小,相当于同时设置了 -XX:NewSize 与 -XX:MaxNewSize 并且取值相等
- 保留是指,一开始不会占用那么多内存,随着使用内存越来越多,会逐步使用这部分保留内存
堆内存,按比例设置
解释:
- -XX:NewRatio=2:1 表示老年代占两份,新生代占一份
- -XX:SurvivorRatio=4:1 表示新生代分成六份,伊甸园占四份,from 和 to 各占一份