JVM垃圾回收概念与理论

关于1.7以前、1.7、1.8版本之间方法区、元空间的转变历史

1.7以前:
方法区/永久代:类、类加载器、运行时常量池、字符串常量池

1.7:
堆:字符串常量池
方法区/永久代:类、类加载器、运行时常量池

1.8:
堆:字符串常量池
元空间:类、类加载器、运行时常量池

JVM内存分配与回收

  1. GC = 内存垃圾回收
  2. GC分为Minor GC 和 Major GC
    a. Minor GC = 新生代GC
    b. Major GC = 老年代GC = Full GC
  3. 以下是windows默认的内存分布
    在这里插入图片描述
  4. 内存优先在Eden区,如果Eden区满了会触发一次Minor GC,会把Eden区和From区里可以回收的对象都回收掉,并且把剩余活着的对象(可能来自Eden & From区)尝试放到Survivor的To区,如果可以放下就放在To区,如果放不下,则会把放不下的大对象提前转移到老年代OldGen区(大对象直接进入老年代)。
  5. 长期存活的对象将进入老年代,Survivor区里的from和to会来回切换,每次切换都会把对象的岁数+1,如果超出一定阈值,则会把超出阈值的对象晋升到老年代中(长期存活的对象将进入老年代)

如何判断对象可以被回收

  1. 引用计数法(不采用)
    给对象加一个引用计数器,每当有一个地方引用它,计数器就加1;每当引用失效,计数器就减1。任何时候如果计数器为0的对象就是不可能在被使用的对象。这个方法简单,高效,但是却没有被采用,主要是因为它很难解决对象之间互相循环引用的问题。
  2. 可达性分析算法(采用)
    通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链的话,则证明此对象是不可用的,可以被回收
  3. finalize()方法最终判定对象是否存活
    finalize方法是给对象最后的一次存活的机会,在上面可达性分析算法中不可达的对象,也不是非死不可的。
  4. 如何判断一个常量是废弃常量:如果当前没有任何String对象引用该字符串常量的话,则此常量是废弃常量
  5. 如何判断一个类是无用的类
    a. 该类所有实例都被回收
    b. 加载该类的ClassLoader已被回收
    c. 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

垃圾收集算法

  1. 标记 - 清除算法
    内存碎片问题
  2. 复制算法
    在这里插入图片描述
  3. 标记 - 整理算法
    标记过程和第一个标记-清除算法一样,但是后续步骤不是直接回收对象,而是把活着的对象向前移动到一起,这样活着的对象就变成连续的了,然后直接清理掉边界以外的内存。
    在这里插入图片描述
  4. 分代收集算法
    这种算法没有新的思想,只是根据对象存活周期的不同来实行不同的收集算法。
    a. 比如新生代每次收集都会有大量对象死去,所以只需要复制少量对象,所以可以用复制算法。
    b. 比如老年代的对象存活几率比较高,而且没有额外空间来分配担保,所以可以使用标记-清除或者标记 - 整理进行垃圾回收

垃圾收集器

  1. Serial收集器(年轻代)
    单线程收集,新生代采用复制算法,老年代采用标记-整理算法;
    特点:简单高效,但是STW时间太长了
    在这里插入图片描述
  2. ParNew收集器(年轻代)
    Serial的多线程版本,新生代采用复制算法,老年代采用标记-整理算法;
    特点:可以和CMS收集器一起配合工作
    在这里插入图片描述
  3. Parallel Scavenge收集器(年轻代)
    和ParNew类似,新生代采用复制算法,老年代采用标记-整理算法;
    特点:关注吞吐量(用户代码占用CPU时间/CPU总时间),即高效利率CPU。
    在这里插入图片描述
  4. Serial Old收集器
    也是单线程收集器。
  5. Parallel Old收集器
    Parallel Scavenge收集器的老年代版本,使用多线程 + 标记-整理算法
    特点:和Parallel Scanvenge一样
  6. CMS收集器(老年代)
    和用户线程一起并发收集,目标是老年代的。
    四个步骤:
    a. 初始标记
    b. 并发标记
    c. 重新标记
    d. 并发清除
    在这里插入图片描述
    特点:
    a. 关注用户线程的停顿时间
    b. 对CPU资源敏感
    c. 无法处理浮动垃圾
    d. 使用标记-清除算法,会导致大量空间碎片
  7. G1收集器(年轻代 + 老年代)
    可以设置收集时间间隔和吞吐率,比较牛B,老年代和年轻代都能收集
    特点:
    a. 适用于多核大容量内存
    b. 年轻代和老年代只是逻辑上的,物理上不再隔离,他们都是Region的集合(可以不连续)
    c. 正常大都是YoungGC和MixedGC,不应该出现Full GC,如果出现Full GC,则说明有优化空间
    d. G1整体上看是标记整理算法的实现,局部看是复制算法实现的
    e. 可预测的停顿
    在这里插入图片描述

总结:

  1. 各种收集器汇总表
    在这里插入图片描述
  2. 收集器搭配使用图
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值