一.题记

Java垃圾回收器的概念看完一遍总是不能深入的理解和记忆,本文主要是对读完《深入理解java虚拟机》一书的整理,以便后续复习之用。

二.概述

1.GC概念

在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。

2.GC算法

对于垃圾回收可以从基本回收策略、分区对待方式、系统线程进行划分。

(1).基本回收策略

1).引用计数器(Reference Counting)

说明:引用计数器是垃圾收集器早期的算法,是唯一没有使用根级的垃圾回收法,通过使用引用计数器来区分存活对象和不再使用的对象,通常堆中的每个对象都会对应一个引用计数器,当每次创建一个对象并指向其引用被赋给一个变量时,该对象的引用计数器被设置为1。以后每当其引用被赋值给一个不同的变量时,该对象的引用计数就加1,当对象丢弃不在使用既出了作用域,该对象的引用计数器减1。任一对象一旦其引用计数器为0,对象就满足了垃圾回收条件。

优点:引用计数收集器算法简单,适于做增量收集,对于程序不能被长时间打断的实时环境特别适合,另外,收集过程也有助于改进引用局部性。

缺点:(1).无法处理循环引用的问题既两个或多个对象之间相互引用,因为它们的引用计数永远不会为0。(2).每次增减引用计数都带来额外开销,而且该算法还需要编译器的高度配合。

2).标记-清除(Mark-Sweep)

说明:垃圾收集过程执行分两阶段。在标记阶段,垃圾收集器遍历引用树,标记每一个遇到的对象。在清理阶段,未被标记的对象被释放,相应内存被返还待用,此算法需要暂停整个应用。

优点:可以轻易回收循环结构,而且不存在为维护引用计数而付出的额外开销和对编译器的依赖。

缺点:(1).在清理阶段,堆中的所有对象,不论是否可达,都会被访问。一方面这对于可能有页面交换的堆所依赖的虚存系统有着非常负面的性能影响;另一方面,因为其中很大一部分对象可能是垃圾,这就意味着垃圾收集器把大量精力都花费在检查和处理垃圾上面了。无论从哪个角度来看,该算法都可能产生收集暂停时间过长、收集开销偏大的问题。(2).标记并清理收集器的另一个不足是它容易导致堆的碎片化,从而引发引用局部性或者大对象分配失败等方面的问题。

3).标记-整理(Mark-Compact)

说明:标记并清理收集器结合了"标记-清除"和"复制"两个算法的优点,分为两个阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象"压缩"到堆的其中一块,按顺序排放。

优点:此算法避免了"标记-清除"算法的碎片问题,同时也避免了"复制"算法的空间问题。

4).复制(Copying)

说明:复制的收集算法将可用内存按容量划分为大小相等的两块,每次只是用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

优点:复制的收集算法每次都是对其中的一块进行内存回收,没存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

缺点:需要两倍内存空间。

(2).分区对待方式

1).增量收集(Incremental Collecting)

说明:实时垃圾回收算法,即在应用进行的同时进行垃圾回收。

2).分代收集(Generational Collecting)

说明:基于对对象生命周期分析后得出的垃圾回收算法。把对象分为新生代、老年代、持久代,对不同生命周期的对象使用不同的算法进行回收。

备注:在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那么就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理或标记-整理算法来进行回收。

(3).系统线程

1).串行收集

说明:串行收集使用单线程处理所有垃圾回收工作。

优点:无需多线程交互,实现容易,而且效率比较高。

缺点:会产生系统停顿,单线程。

适用情况:数据量比较小(100M左右),单处理器下并且对响应时间无要求的应用。

2).并行收集

说明:并行收集使用多线程处理垃圾回收工作。

优点:速度快,效率高,理论上CPU数目越多,越能体现出并行收集器的优势。

缺点:会产生系统停顿,多线程,可以限制线程数量。

适用情况:"对吞吐量有高要求",多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。

3).并发收集

说明:可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间。

优点:不会产生系统停顿,多线程,可以一个线程也可以和应用程序一起组成多线程。

适用情况:"对响应时间有高要求",多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐