
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存模型是程序员在学习java虚拟机技术需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,java虚拟机内存模型常见问题。
1、为什么需要Survivor区?只有Eden不行吗?
如果没有Survivor,Eden区每进行一次MinorGC,存活的对象就会被送到老年代。这样一来,老年代很快被填满,触发MajorGC(因为MajorGC一般伴随着MinorGC,也可以看做触发了FullGC)。老年代的内存空间远大于新生代,进行一次FullGC消耗的时间比MinorGC长得多。执行时间长有什么坏处?频发的FullGC消耗的时间很长,会影响大型程序的执行和响应速度。
可能你会说,那就对老年代的空间进行增加或者较少咯。假如增加老年代空间,更多存活对象才能填满老年代。虽然降低FullGC频率,但是随着老年代空间加大,一旦发生FullGC,执行所需要的时间更长。
假如减少老年代空间,虽然FullGC所需时间减少,但是老年代很快被存活对象填满,FullGC频率增加。
所以Survivor的存在意义,就是减少被送到老年代的对象,进而减少FullGC的发生,Survivor的预筛选保证,只有经历16次MinorGC还能在新生代中存活的对象,才会被送到老年代。
2、为什么需要两个Survivor区?
大的好处就是解决了碎片化。也就是说为什么一个Survivor区不行?一部分中,我们知道了必须设置Survivor区。假设,现在只有一个Survivor区,我们来模拟一下流程:
刚刚新建的对象在Eden中,一旦Eden满了,触发一次MinorGC,Eden中的存活对象就会被移动到Survivor区。这样继续循环下去,下一次Eden满了的时候,问题来了,此时进行MinorGC,Eden和Survivor各有一些存活对象,如果此时把Eden区的,存活对象硬放到Survivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。
永远有一个Survivorspace是空的,另一个非空的Survivorspace无碎片。
希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。