java基础知识之GC

java基础知识之GC

1 GC算法

  • 标记清除
  • 标记整理
  • 复制算法
  1. 标记清除:
  • 特点
    • 标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
    • 在标记完成后统一回收所有被标记的对象
  • 缺点:
    • 效率低,标记和清除两个过程的效率都不高;
    • 空间碎片化严重,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
  1. 标记整理
  • 特点
    • 标记
    • 让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
    • 在一般厂商JVM中老年代GC就是使用的这种算法,由于老年代的特点是每次回收都只回收少量对象。
  1. 复制
    -特点
  • 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
  • 当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉
  • 缺点
    • 内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半
    • 很显然,Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低。我们的新生代GC算法采用的是这种算法

2 判断gc的方法

  • 引用计数收集器
    • 引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。
    • 优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利
    • 缺点:无法解决对象之间的循环引用的问题
  • 跟踪收集器
    • 通过一系列成为“GC roots” 的对象作为起始点,从这些起始点开始,向下搜索,搜索走过的路径称为引用链。当一个对象到GC root 没有任何引用链(图论中的不可达)则证明了对象可被回收。
    • 可作为GC root 的对象
      • java虚拟机栈(Stack)中的引用对象
      • 方法区中类的静态属性引用的对象
      • 方法区中常量引用的对象
      • 本地方法栈中jni引用的对象

3 垃圾回收器

  • Serial收集器
    • 是一个单线程(单线程不仅仅说明是它会使用一个CPU 或者 一条垃圾收集线程去完成收集工作,而是暂停其他工作线即 stop the world)
    • Client 是很好的选择
    • 复制算法
  • Serial Old收集器
    • Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。
    • 主要意义也是在于给Client模式下的虚拟机使用。
  • ParNew收集器
    • Serial收集器的多线程版本
    • Server模式下新生代首选,目前只有它能与CMS收集器配合工作
  • Parallel Scavenge收集器
    • 吞吐量优先”收集器
    • 新生代收集器,复制算法,并行的多线程收集器
    • 目标是达到一个可控制的吞吐量(Throughput)吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
  • Parallel Old收集器
    • Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
    • 在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。
  • CMS收集器
    • 以获取最短回收停顿时间为目标的收集器。
    • 基于“标记—清除”算法实现的
    • CMS收集器的内存回收过程是与用户线程一起并发执行的
    • 它的运作过程分为4个步骤,包括:
      1. 初始标记,“Stop The World”,只是标记一下GC Roots能直接关联到的对象,速度很快
      2. 并发标记,并发标记阶段就是进行GC RootsTracing的过程
      3. 重新标记,Stop The World”,是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,但远比并发标记的时间短
      4. 并发清除(CMS concurrent sweep)
    • 优点:并发收集、低停顿
    • 缺点: 对CPU资源非常敏感。无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
  • G1(Garbage-First)收集器
    • 优点:
      1. 并行与并发:充分利用多CPU、多核环境下的硬件优势
      2. 分代收集:不需要其他收集器配合就能独立管理整个GC堆
      3. 空间整合:“标记—整理”算法实现的收集器,局部上基于“复制”算法不会产生内存空间碎片
      4. 可预测的停顿:能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒

4 对象的分配

  1. 大多数情况对象在eden区中分配,当eden区中没有足够的内存空间进行分配时,虚拟机进行一次minor GC,即在新生代的垃圾回收 速度快于老年代的full GC
  2. 大对象直接进入老年代
  3. 在survivor区中等到maxTeuringThreshold(15)次的进入老年代
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值