一、JVM的内存模型
1. 其中s0,s1为幸存区; 当有一个对象产生时,如果是大对象,那么会分配到老年代中,其他对象会分配到年轻代的Eden区,大对象分配到老年代是为了让他不及时被垃圾回收器回收,释放它占用过的内存,小的对象在经过15次GC后进入老年代。当GC执行时,对象会放在s0中,为这个对象加1,当第二次GC后,s0中的对象进入s1中,又为当前对象加1,知道如此反复加到15时,对象进入老年代。
为何大对象进入老年代
假设大对象最后会晋升老年代,而新生代是基于复制算法来回收垃圾的,由两个Survivor区域配合完成复制算法,如果新生代中出现大对象且能屡次躲过GC,那这个对象就会在两个Survivor区域中来回复制,直至最后升入老年代,而大对象在幸存区里来回复制移动,就会消耗更多的时间;
而且大对象在没有被GC回收时,在幸存区中来回移动时(因为幸存区中的内存比较小)会占用大量幸存区的内存,导致后续不够15此的对象进入老年代,老年代对象多了,会导致频繁的GC,而老年代GC消耗资源>年轻代消耗的资源
二、JVM的优化方式(减少GC机制的执行)
1.设置一个合适的堆大小 2.设置大对象直接进入老年代