大家好,我是锋哥。今天分享关于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
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-
整理的算法进行垃圾回收