小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
摘要
本次分享面试题专题均为自己21届校招时通过牛客以及自己面试遇到的问题,答案均为自己理解整理,如果有错误,请麻烦评论指出,万分感谢,如对您有所帮助,请交出您的三连或者点赞也是爱♥
JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor
1)共享内存区划分
-
共享内存区 = 持久带 + 堆
-
持久带 = 方法区 + 其他
-
Java堆 = 老年代 + 新生代
-
新生代 = Eden + S0 + S1 为什么要分为Eden和Survivor?为什么要设置两个Survivor区?
-
如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor。
(从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC)
(Major GC 是清理老年代。)
(Full GC 是清理整个堆空间—包括年轻代和老年代。)
- Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。
- 设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)