Loading

为什么大对象要直接放入到老年代

从两点分析为什么大对象要直接放入到老年代

    假设大对象最后会晋升老年代,而新生代是基于复制算法来回收垃圾的,由两个Survivor区域配合完成复制算法,如果新生代中出现大对象且能屡次躲过GC,那这个对象就会在两个Survivor区域中来回复制,直至最后升入老年代,而大对象在内存里来回复制移动,就会消耗更多的时间。

    假设大对象最后不会晋升老年代,新生代空间是有限的,在新生代里的对象大部分都是朝生夕死的,如果让一个大对象占据了新生代空间,那么相比起正常的对象被分配在新生代,大对象无疑会让新生代GC提早发生,因为内存空间会更快不够用,如果这个大对象因为业务原因,并不会马上被GC回收,那么这个对象就会进入到Survivor区域,默认情况下,Survivor区域本来就不会被分配的很大,那此时被大对象占据了大部分空间,很可能会导致之后的新生代GC后,存活下来的对象,Survivor区域空间不够放不下,导致大部分对象进入老年代,这就加快了老年代GC发生的时间,而老年代GC对系统性能的负面影响则远远大于新生代GC了。

    总结

个人理解,不管大对象最后能不能进入老年代,利益权衡下,让大对象直接分配到老年代是比较优的思路,而如果真的有大对象是朝生夕死的,那么此时不是考虑让大对象直接放入老年代是不是错误的想法,而是应该分析自己的业务模型,确定原来自己的业务中这个大对象确实是朝生夕死的,此时就通过【-XX:PretenureSizeThreshold】参数调大大对象的阈值,让朝生夕死的大对象变成相对上的小对象,不再直接被分配

posted @ 2021-10-14 15:33  Cooper190113  阅读(229)  评论(0)    收藏  举报