本文主要是介绍【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM 新生代、老年代、永久代的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
大家好,我是锋哥。今天分享关于JVM新生代、老年代、永久代的区别的JVM面试题,希望对大家有帮助;
JVM 新生代、老年代、永久代的区别?
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ) 、老年代 ( Old ) 。而新生代 ( Young )
又被划分为 三个区域:Eden 、 From Survivor 、 To Survivor 。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
新生代中一般保存新出现的对象,所以每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法 ,只需要付出少量存活对象的复制成本就可以完成收集。
老年代中一般保存存活了很久的对象,他们存活率高、没有额外空间对它进行分配担保,就必须采用 “ 标记 -清理” 或者 “ 标记 - 整理 ” 算法。
永久代就是 JVM 的方法区。在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据。这个区中的东西比老年代和新生代更不容易回收。
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网1000道 互联网大厂Java工程师 精选面试题http://java.python222.com/article/971
Minor GC、Major GC、Full GC区别及触 发条件
Minor GC 触发条件一般为:
- eden区满时,触发MinorGC。即申请一个对象时,发现eden区不够用,则触发一次MinorGC。
- 新创建的对象大小 > Eden所剩空间时触发Minor GC
Major GC 和 Full GC 触发条件一般为: Major GC 通常是跟 full GC 是等价的
- 每次晋升到老年代的对象平均大小>老年代剩余空间
- MinorGC后存活的对象超过了老年代剩余空间
- 永久代空间不足
- 执行System.gc()
- CMS GC异常
- 堆内存分配很大的对象
为什么新生代要分Eden和两个 Survivor 区域?
如果没有 Survivor , Eden 区每进行一次 Minor GC ,存活的对象就会被送到老年代。老年代很快被填满,触 发Major GC. 老年代的内存空间远大于新生代,进行一次 Full GC 消耗的时间比 Minor GC 长得多 , 所以需要分为Eden和 Survivor 。
Survivor 的存在意义,就是减少被送到老年代的对象,进而减少 Full GC 的发生, Survivor 的预筛选
保证,只有经历 15 次 Minor GC 还能在新生代中存活的对象,才会被送到老年代。
设置两个 Survivor 区最大的好处就是解决了碎片化,刚刚新建的对象在 Eden 中,经历一次 Minor GC , Eden 中的存活对象就会被移动到第一块survivor space S0 , Eden 被清空;等 Eden 区再满了,就再触发一次 Minor GC, Eden 和 S0 中的存活对象又会被复制送入第二块 survivor space S1 (这个过程非常重要,因为这种复制算法保证了S1 中来自 S0 和 Eden 两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。
Java堆老年代( Old ) 和新生代 ( Young ) 的 默认比例?
默认的新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) , 即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域, Edem 和俩个 Survivor 区域比例是 = 8 : 1 : 1 ( 可以通过参数 – XX:SurvivorRatio 来设定 ) ,但是 JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以 无论什么时候,总是有一块 Survivor 区域是空闲着的。
为什么要这样分代?
其实主要原因就是可以根据各个年代的特点进行对象分区存储,更便于回收,采用最适当的收集算法: 新生代中,每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须采用“ 标记 - 清理 ” 或者 “ 标记 - 整理 ” 算法。
新生代又分为 Eden 和 Survivor ( From 与 To ,这里简称一个区)两个区。加上老年代就这三个区。数据会首先分配到Eden 区当中(当然也有特殊情况,如果是大对象那么会直接放入到老年代(大对象是指需要大量连续内存空间的java 对象)。当 Eden 没有足够空间的时候就会触发 jvm 发起一次 Minor GC ,。如果对象经过一次Minor-GC 还存活,并且又能被 Survivor 空间接受,那么将被移动到 Survivor 空间当中。并将其年龄设为1,对象在 Survivor 每熬过一次 Minor GC ,年龄就加 1 ,当年龄达到一定的程度(默认为 15 )时,就会被晋升到老年代中了,当然晋升老年代的年龄是可以设置的。
新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?
新生代回收器: Serial 、 ParNew 、 Parallel Scavenge
老年代回收器: Serial Old 、 Parallel Old 、 CMS
整堆回收器: G1
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记- 整理的算法进行垃圾回收
这篇关于【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM 新生代、老年代、永久代的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!