JVM内存模型
性能调优
- GC分代机制:
- new出新对象首先放在Eden区;
- Eden区满了就会触发minor gc,将Eden区的非垃圾对象复制到Survivor区的From区域,将剩下的Eden区垃圾对象全部回收。注:栈中或方法区等中的变量作为gcRoot,寻找gcRoot下面引用到的所有对象,将通过各种gcRoot找到的对象(有引用)标记为非垃圾对象,其他的(没被引用)就为垃圾对象(可达性分析算法)
- 如果Eden区再次满了,minor gc就会回收Eden和From两个区域的垃圾对象。此时,Eden和From区的非垃圾对象会被复制到To区。
- 如果Eden区再次满了,minor gc就会回收Eden和To两个区域的垃圾对象。此时,Eden和To区的非垃圾对象会被复制到From区。
- 每次gc,每个对象的分代年龄(年龄数据保存在对象的Object Header中)就会+1。From和To区域的对象会来回复制,直到对象的分代年龄达到某个阈值15,这个对象就会被直接放到老年代中。
- 问题:
- 老年代满了就会触发Full gc,对Eden、From、To、老年代所有区域进行垃圾回收
- 但是所有gc操作时,JVM会把所有的用户线程停掉(STW:stop the world),对用户影响大
- 解决思路:
- 减少gc次数
- 减少gc持续时间
- 具体操作:
- 注:①分代年龄大于15、②大对象、③大小大于Survivor区域内存大小的50%;这三种对象会被直接放入老年代
- 1.增大Survivor区内存大小(对象不容易直接进入老年代,减少Full gc的次数)
- 2.增大Eden区内存大小(减少Minor gc的次数)
-
总结:让对象尽量在年轻代流转,避免对象轻易进入老年代
JVM调优图.png
网友评论