首页 畅享游戏,快乐生活!
手机版
扫描查看手机站

对象都是怎么进入,谈对象如何进入她的生活

时间:2023-11-15 15:08:58 编辑:

大家好,感谢邀请,今天来为大家分享一下对象都是怎么进入的问题,以及和谈对象如何进入她的生活的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

面试题:假设我们使用普通的垃圾回收器,新生代用ParNew、老年代使用ConcMarkSweep(即CMS),发生GC的时候,成为垃圾的对象什么时候会从新生代转移到老年代?

面试题常规回答

有的面试者可能会回答:新对象的产生是先在新生代的Eden区分配内存,当Eden区的内存容量满了之后,进行YoungGC的时候,ParNew垃圾回收器会采用复制清理算法将Eden剩下的存活对象全部复制到其中一个Survivor区,假设为Survivor1区,然后把Eden区清空掉,供新对象分配内存。接下来,Eden区再次满了之后,ParNew会再次将Eden区和Survivor1区中存活的对象全部复制到Survivor2区中,然后再清理。如此循环往复地将存活对象在Survivor1区和Survivor2区来回转移,等到对象的年龄超过了15次(每次垃圾回收都是增加1次年龄),再将存活对象放入老年代。

另外一种情况就是大对象超过了指定阈值(默认1M),直接放入老年代。

上面两种情况是经常被提到的回答,当实际上还有两种情况是我在面试过程中几乎没听过的,接下来我们分析一下剩下的两种情况:

YoungGC后,存活对象太多也进入老年代

如果ParNew进行YoungGC后,发现存活的对象都超过了Survivor区的大小,这时候会直接将全部存活对象转移到老年代。

这里涉及到一个JVM的调优,如果经常出现每次在YoungGC后都把大量的存活对象转移到老年代,那么老年代也会很快就进行OldGC,这个过程将会很漫长,还会发生StopTheWorld,用户看起来就是系统老是一卡一卡的,体验特别差。

这时候就需要考虑一下加大Survivor区的大小了,涉及的参数如下:

-Xms4096M-Xmx4096M-Xmn1024M-XX:SurvivorRatio=8

解释一下参数的意义:

-Xms4096M-Xmx4096M这两个就是JVM整个堆的最小和最大内存容量4G,一般两个值都设为一样。

-Xmn1024M表示新生代可用的内存容量,包括Eden+2个Survivor区。

-XX:SurvivorRatio=8表示新生代中Eden区的比例,这里表示Eden区占80%的内存容量,剩下2个Survivor区各占10%。

动态年龄判断规则:Survivor区中非本次GC的对象都超过了容量的一半,全部进入老年代

还有一种比较少听到的情况,就是当这次YoungGC中,发现当前Survivor区中,其他剩余的存活对象的内存大小已经超过了Survivor区容量的一半时,ParNew会直接将这些对象全部转移到了老年代的堆里面。这是因为垃圾回收器认为,如果对象经常需要存活,那么就应该直接进入老年代中,作为常用对象被使用。

举个例子,假设Survivor区中,年龄3及以上的对象占30%,年龄2的对象占20%,那么这时候就会将年龄2+年龄3及以上的对象全部放入老年代,年龄1会继续转移到另一个Survivor区。

再举另外一个例子,年龄4及以上的对象占40%,年龄3的对象占10%,那么年龄3+年龄4及以上的对象全部放入老年代,年龄2及以下对象会继续转移到另一个Survivor区。

其实这最后一种情况才是最经常发生的,新生代对象转移到老年代。

更多的面试题资料,请先关注一下作者,转发一下本文,然后私信发“面试题剖析”给作者,即可获得相关资料,感谢您的阅读。

文章分享结束,对象都是怎么进入和谈对象如何进入她的生活的答案你都知道了吗?欢迎再次光临本站哦!

热门文章

推荐专题

更多>>

游戏推荐

更多>>