76-JVM垃圾回收器理论分析与讲解

JVM垃圾回收器理论分析与讲解

  • 年轻代(Young Generation)
    • 新生成的对象都放在新生代。年轻代用复制算法进行GC(理论上,年轻代对象的生命周期非常短,所以适合复制算法);
    • 年轻代分为三个区。一个eden区,两个survivor(可以通过参数设置survivor)。对象在eden区中生成。当eden区满时,还存活的对象将被复制到一个survivor区,当这个survivor区满时,此区的存活对象将被复制到另外一个survivor区,当第二个survivor区也满了的时候,从第一个survivor区复制过来的并且此时还存活的对象,将被复制到老年代。2个survivor是完全对称,轮流替换。
    • eden和2个survivor的缺省比例是8:1:,也就是10%的空间会被浪费。可以根据GC log的信息调整大小的比例。
  • 老年代(Old Generation)
    • 存放了经过一次或多次GC还存活的对象
    • 一般采用Mark-Sweep后者Mark-Compact算法进行GC;
    • 有多种垃圾收集器可以选择。每种垃圾收集器可以看做一个GC算法的具体实现。可以根据具体应用的需求选用合适的垃圾收集器(追求吞吐量?追求最短相应的时间?)
  • 永久代(已经弃用)
    • **并不属于堆(Heap)**但是GC也会涉及到这个区域;
    • 存放了每一个Class的结构信息,包括常量池、字段描述、方法描述。与垃圾收集要收集的Java对象关系不大。
  • 内存区域(备注:在Hotspot中本地方法栈和JVM方法栈是同一个,因此也可用-Xss控制栈的大小 )
    在这里插入图片描述

  • ① 堆上分配

    • 大多数情况在eden上分配,偶尔会直接在old上分配;
    • 细节取决于GC的实现。
  • ② 栈上分配

    • 原子类型的局部变量
  • 内存回收
    • GC要做的是将那些dead的对象所占用的内存回收掉
      • Hotspot认为没有引用的对象是dead的
      • Hotspot将引用分为四种:Strong(强)、Soft(软)、Weak(弱)、Phantom(虚)
        • Strong即默认通过 Object o = new Object()这种方式赋值的引用;
        • Soft、Weak、Phantom这三种则都是继承Reference。
    • 在Full GC 时会对Reference类型的引用进行特殊处理
      • Soft:内存不够一定会被GC、长期不用也会被GC;
      • Weak:一定会被GC,当被mark为dead,会在ReferenceQueue中通知;
      • Phantom:本来就没引用,当从jvm heap中释放时会通知。

在这里插入图片描述

  • GC的时机
    • 在分代模型的基础上,GC从时机上分为两种:Scavenge GC和Full GC
    • Scavenge GC (Minor GC)
      • 触发时机:新对象生成时,eden空间满了
      • 理论上eden区大多数对象会在Scavenge GC 回收,复制算法的执行效率会很高,Scavenge GC时间比较短。
    • Full GC
      • 对整个JVM进行整理,包括Young、Old和Perm
      • 主要的触发时机:① Old满了 ② Prem满了 ③ system.gc()
      • 效率很低,尽量较少Full GC
  • 垃圾回收器
    • 分代模型:GC的宏观愿景;
    • 垃圾回收器:GC的具体实现;
    • Hotspot JVM提供多种垃圾回收器,我们需要根据具体应用的需要采用不同的回收器;
    • 没有万能的垃圾回收器,每种垃圾回收器都有自己的使用场景。
  • 垃圾收集器的“并行”和“并发”
    • 并行(Parallel):指多个收集器的线程同时工作,但是用户线程处于等待状态;
    • 并发(Concurrent):指收集器在工作的同时,可以允许用户线程工作;
      • 并发不代表解决了GC停顿的问题,在关键的步骤还是要停顿。比如:在收集器标记垃圾的时候。但在清除垃圾的时候,用户线程可以和GC线程并发执行。
  • Serial收集器
    • 单线程收集器,收集时会暂停所有工作线程(Stop The World,简称STW),使用复制收集算法,虚拟机运行在Client模式时的默认新生代收集器。
      • 最早的收集器,单线程进行GC;
      • New和Old Generation 都可以使用;
      • 在新生代,采用复制算法;在老年代中,采用Mark-Compact算法;
      • 因为是单线程GC,没有多线程切换的额外开销,简单使用;
      • Hotspot Client 模式缺省的收集器。
        在这里插入图片描述
  • ParNew收集器
    • ParNew收集器就是Serial的多线程版本,除了使用多个收集线程外,其余行为包括算法、STW、对象分配规则、回收策略等都与Serial收集器一模一样。
    • 对应的这种收集器是虚拟机运行在Server模式的默认新生代收集器,在单CPU的环境中,ParNew收集器并不会比Serial收集器有更好的效果。
    • ParNew收集器是Serial收集器在新生代的多线程版本;
    • 使用复制算法(因为针对新生代);
    • 只有在多CPU的环境中,效率才会比Serial收集器高;
    • 可以通过-XX:ParallelGCThreads来控制GC线程数的多少。需要结合具体CPU的个数;
    • ParNew收集器是Server模式下新生代的缺省收集器。
  • Parallel Scavenge 收集器
    • Parallel Scavenge 收集器也是一个多线程收集器,也是使用复制算法,但它的对象分配规则与回收策略都与ParNew收集器有所不同,它是以吞吐量最大化(即GC时间占总运行时间最小)为目标的收集器实现,它允许较长时间的STW换取总吞吐量最大化。
  • Serial Old收集器
    • Serial Old是单线程收集器,使用标记-整理算法,是老年代的收集器。
  • Parallel Old收集器
    • 老年代版本吞吐量优先收集器,使用多线程的标记-整理算法,JVM1.6提供,在此之前,新生代使用了PS收集器的话,老年代除Serial Old外别无选择,因为PS无法与CMS收集器配合工作;
    • Parallel Old收集器是Parallel Scavenge在老年代的实现;
    • 在JVM 1.6才出现Parallel Old;
    • 采用多线程,Mark-Compact算法;
    • 更注重吞吐量;
    • Parallel Scavenge + Parallel Old = 高吞吐量,但是GC停顿可能不理想。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSvL3VIK-1590329797175)(G:\笔记\图片\1579617097952.png)]

  • CMS(Concurrent Mar Sweep)收集器
    • CMS是一种以最短停顿时间为目标的收集器,使用CMS并不能达到GC效率最高(总体GC时间最小),但它能尽可能降低GC时服务的停顿时间,CMS收集器使用的是标记-清楚算法。
    • 追求最短停顿时间,非常适合Web应用;
    • 只针对老年区,一般结合ParNew使用;
    • Concurrent,GC线程和用户线程并发工作(尽量并发);
    • Mark-Sweep;
    • 只有在多CPU环境下才有意义;
    • 使用-XX:+UseConcMarkSweepGC打开;
    • 缺点:
      • CMS以牺牲CPU资源的代价来减少用户线程的停顿。当CPU个数少于4的时候,有可能对吞吐量影响非常大;
      • CMS在并发清理的过程中,用户线程还在跑。这时候需要预留一部分空间给用户线程;
      • CMS用Mark-Sweep,会带来碎片问题。碎片过多的时候会容易频繁触发Full GC。

GC垃圾收集器的JVM参数定义:

> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePtriGFP-1590329797181)(G:\笔记\图片\1579694451841.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-25jucuaH-1590329797185)(G:\笔记\图片\1579694490748.png)]在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值