美文网首页
垃圾收集

垃圾收集

作者: begonia_rich | 来源:发表于2018-02-23 00:43 被阅读4次

本片文章着重介绍虚拟机在垃圾收集中所遇到的问题,解决的思路,现在的垃圾收集策略等

如何确定对象死亡

 1引用计数算法:每个对象都设置了被引用的次数进行统计,无法解决循环引用的问题(实现简单,不过有性能损失,目前主流商用JVM均不采用)
 2可达性分析算法:从gc根节点出发进行搜索,能搜索到的都是存活的,否则都是死亡的(目前的主流实现都是采用这个算法)

gc根节点包括有:1虚拟机栈(帧栈中的本地变量表)2方法区中的静态属性与常量 3本地方法栈。可以看到最主要的搜索对象还是虚拟机栈,也就是在gc的那一刻现在所有的方法引用涉及到的对象是最主要的收集出发点

垃圾收集算法

 1标记-清除算法:先标记,然后统一清理,有2个不足:效率低,碎片化严重
 2复制算法:通过将内存划开进行使用,收集时直接复制到另一部分,优点:速度快,缺点:内存不能100%使用
 3标记-整理算法:先标记,然后整理,优点:100%内存使用,缺点:效率很低,内存区域移动缓慢
 4分代收集算法:将gc区域(主要是堆区)进行分代,新生代采用复制算法,老年代采用标记-清理或标记-整理算法

很明显的看到这个分代收集算法只是将上面的几种算法进行的整合,并不是一个新的算法,后面看垃圾收集器(也就是这几个算法的实现)的时候就看到了,需要对不同分代配置不同的垃圾收集器进行收集进行组装。

收集器实现所需的基础

 1枚举根节点:在字节码中会针对所需到达的安全点插入检查的操作,如果一旦需要挂起就会设置,线程检查到就会挂起(设置个状态让代码在安全点进行检查然后挂起)
 2**安全点:从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停暂停所以活动线程,但是线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,等待GC结束**。
 3安全区域:对于安全点的扩大范围,比如说在读写文件,这个时间比较长,实际上就认为进入了安全区域,等待返回之后直接再检查

这些都是垃圾收集器实现的基础,要分清楚算法和实现,实现还需要更多的努力,算法还是太理想了。安全点这个概念的理解还是有点意思的。

垃圾收集器

 1Serial收集器:单线程新生代复制算法,-client参数默认收集器
 2ParNew收集器:Serial的多线程版本
 3Parallel Scavenge收集器:新生代的复制算法收集器,更关注吞吐量,-server参数默认收集器
 4Serial Old收集器:Serial的老年版本使用标记-整理算法-client和server都是默认的老年代算法,这是最有效的整理
 5Parallel Old收集器:Parallel Scavenge的老年版本,使用多线程实现标记-整理算法,高吞吐量
 6CMS收集器:老年代的标记-清理算法,最短回收停顿,现在比较推荐的
 7G1收集器:是目前最前沿的收集器

可以看到不同的收集器针对不同的分代实现不同的收集算法,可以通过下面的参数进行设置

JVM垃圾收集相关参数1 JVM垃圾收集相关参数2

总结

JVM在垃圾收集部分给予我们使用者的选择并不是很多,对于使用者来说理解了收集算法,针对不同的线上环境配置不同的收集器以达到最优的性能即可。可以在本地试一下打印gc日志然后看一下,会发现其实项目一启动gc非常频繁只不过很短暂罢了,这里推荐用Jconsole或者VisualVM来看一下gc日志,也挺有意思。

相关文章

  • JS垃圾回收机制(内存问题)

    垃圾收集机制理解 垃圾收集机制:释放无用的数据,回收内存。 垃圾收集机制分类:1)自动回收 2)手动回收 垃圾收集...

  • JVM学习笔记四【垃圾收集器】

    前文我们针对垃圾收集的区域,垃圾收集的对象,垃圾收集算法进行了介绍;而垃圾收集器就是收集算法的实现,如下是HotS...

  • 垃圾收集器

    简介  垃圾收集器是垃圾收集算法的具体实现,各种垃圾收集器没有好坏之分,适合自己当前应用的垃圾收集器才是最好的垃圾...

  • 关于垃圾回收

    Runtime.getRuntime().gc() 是告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是...

  • Leakcanary

    Leakcanary System.gc(); //告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确...

  • 不同的垃圾回收器

    G1之外的其他垃圾回收器 Serial收集器:使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工...

  • 第三章(二)GC

    本篇主要讲 垃圾收集算法 、 HotSpot的的算法实现 和 垃圾收集器。 垃圾收集算法 标记-清除算法 Mark...

  • JVM垃圾收集器

    一、Serial收集器 单线程收集器,只会使用一条垃圾收集线程去完成垃圾收集工作,在进行垃圾收集工作的时候,必须暂...

  • JVM:这是一份全面 & 详细的 (GC)垃圾收集算法

    前言 不同的内存区域采用不同的垃圾收集算法 而不同垃圾收集算法决定了垃圾收集的效率 & 效果 本文将全面讲解垃圾收...

  • JavaScript之垃圾收集

    垃圾收集 JavaScript 具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存。这种垃圾收集机制...

网友评论

      本文标题:垃圾收集

      本文链接:https://www.haomeiwen.com/subject/nmdtxftx.html