新创建对象直接触发fullGC问题

来源:互联网 发布:linux 关机脚本 编辑:程序博客网 时间:2024/04/29 11:03
今天在群里遇到个问题,这段程序,老年代占用会不断增大、直到fullgc
ArrayList扩容默认申请的对象在young分区,而其包含的对象晋升到老年代了,所以无论是young gc还是cms gc都不能一次完全把垃圾对象回收掉,只能full gc才能一次性全部gc掉
隔代引用的问题
虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制
如果不是太大或者太老(gc年龄),可以思考是不是1内存担保原因,或者是2GC时,同龄的小对象占据survivor半数以上空间
同龄alive小对象太多,gc时占据s区半数以上空间,也会被清到老年代