java road

Java的垃圾回收机制-学习笔记

2018-06-22  本文已影响23人  HardWJJ

可回收对象的判定方法:

引用计数法:

对于一个对象 A,只要有任何一个对象引用了 A,则 A 的引用计数器就加 1,当引用失效时,引用计数器就减 1。只要对象 A 的引用计数器的值为 0,则对象 A 就不可能再被使用。

可达性分析法:

常见的GC算法:

标记-清除算法(Mark-Sweep):

基础的GC算法,主要的步骤为标记和清除。

将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

标记-整理(或叫压缩)算法(Mark-Compact):

标记-压缩算法是一种老年代的回收算法。首先需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端。

增量算法 (Incremental Collecting):

增量算法的基本思想是,让垃圾收集线程和应用程序线程交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。

分代算法 (Generational Collecting):

将内存区间根据对象的特点分成几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收的效率。

常见的垃圾收集器:

新生代串行收集器:

新生代串行处理器使用复制算法,实现相对简单,逻辑处理特别高效,且没有线程切换的开销。
两个特点:
第一,它仅仅使用单线程进行垃圾回收。
第二,它独占式的垃圾回收。

老年代串行收集器:

使用的是标记-压缩算法。和新生代串行收集器一样,它也是一个串行的、独占式的垃圾回收器。

并行收集器(ParNew):

工作在新生代的垃圾收集器,它只简单地将串行回收器多线程化。它的回收策略、算法以及参数和串行回收器一样。

新生代并行回收收集器(Parallel Scavenge):

和并行收集器一样都是多线程、独占式的收集器。
特点:它非常关注系统的吞吐量。

老年代并行回收收集器:

多线程并发的收集器,关注吞吐量的收集器。JDK1.6 之后开始使用标记-压缩算法。

CMS (Concurrent Mark Sweep):

主要关注于系统停顿时间,使用的是标记-清除算法,是一个使用多线程并发回收的垃圾收集器。

G1收集器:

一款服务器的垃圾收集器,在吞吐量和停顿控制上,预期要优于 CMS 收集器。

参考资料:

1、Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 - CSDN博客
2、JVM 自动内存管理:对象判定和回收算法-极客学院
3、Java 技术,IBM 风格: 垃圾收集策略,第 1 部分
4、JVM 垃圾回收器工作原理及使用实例介绍

上一篇 下一篇

猜你喜欢

热点阅读