gc一点理解
2017-10-11 13:47
148 查看
好像好久没有写博客 ,今天特地抽空看了一下jvm中垃圾回收算法
我们都知道java中当对象不在使用时,java会帮我们进行对象清除。下面特地介绍几种垃圾回收算法;
一:引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被引用时加1 ,而当引用不在使用时则减1,但是这种方法有个比较严重的问题,就是无法循环引用的情况。
二:标记清除法:就是分为标记和清除两个阶段进行处理内存中对象,当然这种方法也有比较大的弊端,就是碎片的问题,垃圾回收后的空间不是连续的,不连续的空间使用效率比较低。
三:复制算法:其核心思想就是将内存空间分为两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中存活的对象复制到未使用的内存中,之后在清除之前使用的内存对象,反复去交换两个内存中的角色,完成垃圾收集。(Java中新生代使用这种算法)
四:标记压缩法:标记压缩法在标记清除基础上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理。(java中老年代就是使用这种算法)
垃圾收集器:
串行回收器: 串行回收器使用单线程进行垃圾回收,每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性与独占性往往有更好的性能提现。使用-XX:+UseSerialGC 参数可以设置新生代串行回收器和老年代串行回收器。
并行回收器:
1.parNew回收器, 是一个工作在新生代的垃圾回收器,他只是简单的将串行回收多线程化,他的回收策略和算法和串行回收器一样的。
使用 -XX:UseParNewGC 新生代ParnNew 回收器,老年代则使用串行回收器
2. 新生代ParallelGC 回收器,使用了复制算法的收集器,也是多线程独占形式的收集器,但ParallelGC回收器有个重要的特点 ,就是它非常关注系统的吞吐量。
3.老年代ParallerOldGC 回收器也是一种多线程的回收器,和新生代的ParallerGC回收器一样,也是一种关注吞吐量的回收器 它使用的标记压缩器算法进行实现的。
cms回收器:
它使用的是标记清除算法,主要关注系统停顿时间。
使用-XX:+UseConcMarkSweepGC 进行设置。
使用-XX:+ConGCThreads 设置并发线程数量。
CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS在使用过程中确保应用程序内存足够可用。
我们都知道java中当对象不在使用时,java会帮我们进行对象清除。下面特地介绍几种垃圾回收算法;
一:引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被引用时加1 ,而当引用不在使用时则减1,但是这种方法有个比较严重的问题,就是无法循环引用的情况。
二:标记清除法:就是分为标记和清除两个阶段进行处理内存中对象,当然这种方法也有比较大的弊端,就是碎片的问题,垃圾回收后的空间不是连续的,不连续的空间使用效率比较低。
三:复制算法:其核心思想就是将内存空间分为两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中存活的对象复制到未使用的内存中,之后在清除之前使用的内存对象,反复去交换两个内存中的角色,完成垃圾收集。(Java中新生代使用这种算法)
四:标记压缩法:标记压缩法在标记清除基础上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理。(java中老年代就是使用这种算法)
垃圾收集器:
串行回收器: 串行回收器使用单线程进行垃圾回收,每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性与独占性往往有更好的性能提现。使用-XX:+UseSerialGC 参数可以设置新生代串行回收器和老年代串行回收器。
并行回收器:
1.parNew回收器, 是一个工作在新生代的垃圾回收器,他只是简单的将串行回收多线程化,他的回收策略和算法和串行回收器一样的。
使用 -XX:UseParNewGC 新生代ParnNew 回收器,老年代则使用串行回收器
2. 新生代ParallelGC 回收器,使用了复制算法的收集器,也是多线程独占形式的收集器,但ParallelGC回收器有个重要的特点 ,就是它非常关注系统的吞吐量。
3.老年代ParallerOldGC 回收器也是一种多线程的回收器,和新生代的ParallerGC回收器一样,也是一种关注吞吐量的回收器 它使用的标记压缩器算法进行实现的。
cms回收器:
它使用的是标记清除算法,主要关注系统停顿时间。
使用-XX:+UseConcMarkSweepGC 进行设置。
使用-XX:+ConGCThreads 设置并发线程数量。
CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS在使用过程中确保应用程序内存足够可用。
相关文章推荐
- linux 启动过程以及 /etc/rc.d/init.d/目录的一点理解
- 关于实例变量的一点理解
- 对数据结构一点一小小的理解(七)——二叉树
- 我的一点浅见——关于机器的理解
- 对MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST)的一点理解
- 对/etc/rc.d/init.d目录的一点理解
- 理解 Java 的 GC 与 幽灵引用
- 对卷积的一点理解
- ios里面 Localizable.strings文件一点小知识(个人理解)
- 谈谈自己对随机森林(Random Forest)的一点理解以及代码注释~
- 对于C++保护继承方式的一点理解
- RxSwift 入坑好多天 - 终于有了一点理解
- Service的一点理解
- Metabuilders.Webcontrols.Masterpages应用的一点理解
- 黑马程序员--Io流,(含自己的一点理解,与图解)
- 观察者模式的一点小理解
- 对线程的一点理解
- MEF的一点理解
- 对于观察者模式、Reactor模式、Proactor模式的一点理解