JVM相关知识集

本文详细介绍了JVM中对象判定死亡的方法,引用类型的区别,以及垃圾收集的各种算法,如标记-清除、复制、标记-整理和分代收集。重点讲述了HotSpot中新生代和老年代的划分及其回收策略,以及G1收集器的独特之处。
摘要由CSDN通过智能技术生成

JVM相关知识集

一、怎么判定对象已经“死去”?

常⻅的判定⽅法有两种:引⽤计数法和可达性分析算法,HotSpot中采⽤的是可达性分析算法。

引⽤计数法

给对象中添加⼀个引⽤计数器,每当有⼀个地⽅引⽤它时,计数器值就加1;当引⽤失效时,计数器 值就减1;任何时刻计数器为0的对象就是不可能再被使⽤的。 客观地说,引⽤计数算法的实现简单,判定效率也很⾼,在⼤部分情况下它都是⼀个不错的算法,但 是主流的Java虚拟机⾥⾯没有选⽤引⽤计数算法来管理内存,其中最主要的原因是它很难解决对象之 间相互循环引⽤的问题。

可达性分析算法

这个算法的基本思路就是通过⼀系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜 索,搜索所⾛过的路径称为引⽤链,当⼀个对象到GC Roots没有任何引⽤链相连(⽤图论的话来说, 就是从GC Roots到这个对象不可达)时,则证明此对象是不可⽤的。如下图所⽰,对象object 5、 object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可 回收的对象

二、介绍以下四种引⽤(强引⽤、软引⽤、弱引⽤、虚引⽤)

强引⽤:

在程序代码之中普遍存在的,类似“Object obj=new Object()”这类的引⽤,只要强引⽤还 存在,垃圾收集器永远不会回收掉被引⽤的对象。

软引⽤:

⽤来描述⼀些还有⽤但并⾮必需的对象,使⽤SoftReference类来实现软引⽤,在系统将要 发⽣内存溢出异常之前,将会把这些对象列进回收范围之中进⾏第⼆次回收。

弱引⽤:

⽤来描述⾮必需对象的,使⽤WeakReference类来实现弱引⽤,被弱引⽤关联的对象只能⽣ 存到下⼀次垃圾收集发⽣之前。

虚引⽤:

是最弱的⼀种引⽤关系,使⽤PhantomReference类来实现虚引⽤,⼀个对象是否有虚引⽤ 的存在,完全不会对其⽣存时间构成影响,也⽆法通过虚引⽤来取得⼀个对象实例。为⼀个对象设置 虚引⽤关联的唯⼀⽬的就是能在这个对象被收集器回收时收到⼀个系统通知。

三、垃圾收集有哪些算法,各⾃的特点?

标记 - 清除算法

⾸先标记出所有需要回收的对象,在标记完成后统⼀回收所有被标记的对象。它的主要不⾜有两个: ⼀个是效率问题,标记和清除两个过程的效率都不⾼;另⼀个是空间问题,标记清除之后会产⽣⼤量 不连续的内存碎⽚,空间碎⽚太多可能会导致以后在程序运⾏过程中需要分配较⼤对象时,⽆法找到 ⾜够的连续内存⽽不得不提前触发另⼀次垃圾收集动作。

复制算法

为了解决效率问题,⼀种称为“复制”(Copying)的收集算法出现了,它将可⽤内存按容量划分为 ⼤⼩相等的两块,每次只使⽤其中的⼀块。当这⼀块的内存⽤完了,就将还存活着的对象复制到另外 ⼀块上⾯,然后再把已使⽤过的内存空间⼀次清理掉。这样使得每次都是对整个半区进⾏内存回收, 内存分配时也就不⽤考虑内存碎⽚等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简 单,运⾏⾼效。只是这种算法的代价是将内存缩⼩为了原来的⼀半,未免太⾼了⼀点。

标记 - 整理算法

根据⽼年代的特点,有⼈提出了另外⼀种“标记-整理”(Mark-Compact)算法,标记过程仍然 与“标记-清除”算法⼀样,但后续步骤不是直接对可回收对象进⾏清理,⽽是让所有存活的对象都 向⼀端移动,然后直接清理掉端边界以外的内存。

分代收集算法

当前商业虚拟机的垃圾收集都采⽤“分代收集”算法,这种算法并⽆新的⽅法,只是根据对象的存活 周期的不同将内存划分为⼏块,⼀般是把Java堆分为新⽣代和⽼年代,这样就可以根据各个年代的特 点采⽤最适当的收集算法。在新⽣代中,每次垃圾收集时都发现有⼤批对象死去,只有少量存活,那 就选⽤复制算法,只需要付出少量存活对象的复制成本就可以完成收集。⽽⽼年代中因为对象存活率 ⾼、没有额外空间对它进⾏分配担保,就必须使⽤“标记-清理”或“标记-整理”算法来进⾏回收。

四、HotSpot为什么要分为新⽣代和⽼年代?

HotSpot根据对象存活周期的不同将内存划分为⼏块,⼀般是把Java堆分为新⽣代和⽼年代,这样就 可以根据各个年代的特点采⽤最适当的收集算法。在新⽣代中,每次垃圾收集时都发现有⼤批对象死 去,只有少量存活,那就选⽤复制算法,只需要付出少量存活对象的复制成本就可以完成收集。⽽⽼ 年代中因为对象存活率⾼、没有额外空间对它进⾏分配担保,就必须使⽤“标记—清理”或者“标记 —整理”算法来进⾏回收。
其中新⽣代⼜分为1个Eden区和2个Survivor区,通常称为From Survivor和To Survivor区。

五、新⽣代中Eden区和Survivor区的默认⽐例?

在HotSpot虚拟机中,Eden区和Survivor区的默认⽐例为8:1:1,即-XX:SurvivorRatio=8,其中 Survivor分为From Survivor和ToSurvivor,因此Eden此时占新⽣代空间的80%。

六、HotSpot GC的分类?

针对HotSpot VM的实现,它⾥⾯的GC其实准确分类只有两⼤种: 1)Partial GC:并不收集整个GC堆的模式,具体如下: 1. Young GC/Minor GC:只收集新⽣代的GC。 2. Old GC:只收集⽼年代的GC。只有CMS的concurrent collection是这个模式。 3. Mixed GC:收集整个新⽣代以及部分⽼年代的GC,只有G1有这个模式。 2)Full GC/Major GC:收集整个GC堆的模式,包括新⽣代、⽼年代、永久代(如果存在的话)等所 有部分的模式。 FullGC是对整个堆来说的,出现Full GC的时候经常伴随⾄少⼀次的Minor GC,但⾮绝对的。Major GC的速度⼀般会⽐Minor GC慢10倍以上。

七、什么情况下新⽣代对象会晋升到⽼年代?

1.如果新⽣代的垃圾收集器为Serial和ParNew,并且设置了-XX:PretenureSizeThreshold参数,当 对象⼤于这个参数值时,会被认为是⼤对象,直接进⼊⽼年代。
2.Young GC后,如果对象太⼤⽆法进⼊Survivor区,则会通过分配担保机制进⼊⽼年代。
3.对象每在Survivor区中“熬过”⼀次Young GC,年龄就增加1岁,当它的年龄增加到⼀定程度(默 认为15岁,可以通过-XX:MaxTenuringThreshold设置),就将会被晋升到⽼年代中。
4. 如果在Survivor区中相同年龄所有对象⼤⼩的总和⼤于Survivor空间的⼀半,年龄⼤于或等于该年 龄的对象就可以直接进⼊⽼年代,⽆须等到MaxTenuringThreshold中要求的年龄。

八、新⽣代垃圾回收器和⽼年代垃圾回收器都有哪些?有什么区别?

• 新⽣代回收器:Serial、ParNew、Parallel Scavenge
• ⽼年代回收器:Serial Old、Parallel Old、CMS
• 整堆回收器:G1

新⽣代垃圾回收器⼀般采⽤的是复制算法,复制算法的优点是效率⾼,缺点是内存利⽤率低;⽼年代 回收器⼀般采⽤的是标记-整理的算法进⾏垃圾回收。

1)Serial收集器(复制算法): 新⽣代单线程收集器,标记和清理都是单线程,优点是简单⾼效;
2)ParNew收集器 (复制算法): 新⽣代收并⾏集器,实际上是Serial收集器的多线程版本,在多核 CPU环境下有着⽐Serial更好的表现;
3)Parallel Scavenge收集器 (复制算法): 新⽣代并⾏收集器,追求⾼吞吐量,⾼效利⽤ CPU。吞吐 量 = ⽤⼾线程时间/(⽤⼾线程时间+GC线程时间),⾼吞吐量可以⾼效率的利⽤CPU时间,尽快完成程 序的运算任务,适合后台应⽤等对交互相应要求不⾼的场景;
4)Serial Old收集器 (标记-整理算法): ⽼年代单线程收集器,Serial收集器的⽼年代版本;
5)Parallel Old收集器 (标记-整理算法): ⽼年代并⾏收集器,吞吐量优先,Parallel Scavenge收 集器的⽼年代版本;
6)CMS(Concurrent Mark Sweep)收集器(标记-清除算法): ⽼年代并⾏收集器,以获取最短回 收停顿时间为⽬标的收集器,具有⾼并发、低停顿的特点,追求最短GC回收停顿时间。对于要求服 务器响应速度的应⽤上,这种垃圾回收器⾮常适合。在启动 JVM 的参数加上“- XX:+UseConcMarkSweepGC”来指定使⽤ CMS 垃圾回收器。CMS 使⽤的是标记-清除的算法实现 的,所以在 gc 的时候回产⽣⼤量的内存碎⽚,当剩余内存不能满⾜程序运⾏要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采⽤ Serial Old 回收器进⾏垃圾清除,此时的性能将会被降 低。
7)G1(Garbage First)收集器 (标记-整理算法): Java堆并⾏收集器,G1收集器是JDK1.7开始提供 的⼀个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产⽣内存碎⽚。此外,G1收 集器不同于之前的收集器的⼀个重要特点是:G1回收的范围是整个Java堆(包括新⽣代,⽼年代),⽽ 前六种收集器回收的范围仅限于新⽣代或⽼年代。

如有侵权请私信告诉我哟~~~~

  • 37
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值