引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,但 无法解决对象相互循环引用的问题 。
// 循环引用
Node a=new Node(); Node b=new Node(); a.next=b; b.next=a;
可以作为GC Roots的对象包括下面几种:
* 虚拟机栈(栈帧中的本地变量表)中引用的对象; * 方法区中类静态属性引用的对象; * 方法区中常量引用的对象; * 本地方法栈中JNI(即一般说的Native方法)引用的对象。
为了避免对象相互循环引用的问题,JVM中使用可达性分析判断对象是否可以被回收。
大部分引用都是强引用,是使用最普遍的引用。 强引用不会被垃圾回收器回收,始终是可达状态。 当内存空间不足时,JVM宁可抛出OOM异常,使程序异常终止,也不会通过回收具有强引用的对象来解决内存不足的问题。这是造成Java内存泄漏的重要原因之一。(联系ThreadLocal例子)
对于具有软引用的对象,当内存空间足够时,垃圾回收器不会回收它,若内存空间不够了,就会回收这些对象的内存。软引用可以用来实现内存敏感的高速缓存。
只要垃圾回收机制运行并发现了具有弱引用的对象,不管当前内存空间是否足够,都会回收该对象的内存。垃圾回收线程的优先级很低,不一定很快发现只具有弱引用的对象。
主要作用是用于 跟踪对象被垃圾回收的活动 。不能单独使用,必须与引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它具有虚引用,就会在回收对象的内存前把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用来了解被引用的对象是否要被垃圾回收。
废弃常量 :运行时常量池主要回收废弃常量。如果当前没有任何对象引用该常量,就说明该常量是废弃常量。
无用的类 :需要同时满足3个条件。
原理 :首先标记出可以回收的对象,在标记完成后统一回收所有被标记的对象。
特点 : 内存碎片化严重、效率低 。
原理 :按内存容量将内存划分为大小相同的两块。每次只使用其中的一块,当这一块内存满了之后,将存活的对象复制到未使用的一块中,然后把使用的那一块一次清理。
特点:不易产生内存随便,但效率大大降低。
原理 :首先标记出可以回收的对象,然后将存活对象移动至内存的一端,然后清除掉边界外的对象。
特点:根据老年代特点提出的一种标记算法。
当前虚拟机的垃圾收集都采用分代收集算法。
在 新生代 ,每次收集都会有大量对象死去,所以采用 复制算法 ,只需复出少了对象的复制成本就可以完成每次垃圾收集。
在 老年代 ,对象存活几率比较高,每次垃圾回收是时只有少量对象需要被回收,因此采用 标记-整理算法 进行垃圾收集。
JVM针对新生代和老年代分别提供了不同的垃圾收集器。
Serial收集器是最基本的垃圾收集器。Serial是单线程的收集器,只会使用一条垃圾收集线程去完成垃圾收集工作,同时在进行垃圾收集工作时不许暂停其他所有的工作线程("Stop the World"),直到收集结束。
新生代采用复制算法,老年代采用标记-整理算法。
Serial收集器简单高效,对于限定单个CPU环境来说没有线程交互的开销,可以获得最高的单线程垃圾收集效率,因此Serial垃圾收集器时JVM运行在Client模式下默认的新生代垃圾收集器。
ParNew收集器是Serial收集器的多线程版本(多线程并发),除了使用多线程进行垃圾收集外,其余行为和Serial收集器完全一样。
ParNew收集器是运行在Server模式下的JVM的首要选择,除了Serial收集器,只有它能与CMS收集器配合工作。
与ParNew收集器类似,但Parallel Scavenge收集器的关注点是吞吐量(高效率地利用CPU)。CMS等垃圾收集器地关注点是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。
Parallel Scavenge提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX: MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX: GCTimeRatio参数。
-XX: MaxGCPauseMillis
-XX: GCTimeRatio
Serial收集器的老年代版本。它具有两大用途:一种是在JDK1.5及以前的版本中与Parallel Scavenge收集器搭配使用,另一种是作为CMS收集器的后备方案。
Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法。在注重吞吐量和CPU资源的场合,可以优先考虑Parallel Scavenge收集器和Parallel Old收集器。
CMS(Concurrent Mark Sweep)收集器是一种 以获取最短回收停顿时间为目标 的收集器,非常符合在注重用户体验的应用上使用。 CMS收集器是第一款真正意义上的并发收集器,第一次实现了让垃圾回收线程与用户线程(基本上)同时工作。CMS收集器是基于 标记-清除算法 的。其运行过程包括四个步骤:
优点: 并发收集、低停顿 。
缺点:对CPU资源敏感;无法处理浮动垃圾;使用的"标记-清除"会导致收集结束时产生大量内存碎片。
G1(Garbage First)是面向服务器的垃圾收集器,主要针对配备多核处理器及大容量内存的机器, 以极高概率满足GC停顿时间要求的同时还具备高吞吐量性能特征 。
特点:
G1收集器运行步骤大致分为: 初始标记;并发标记;最终标记;筛选回收 。
G1收集器避免全区域垃圾收集,把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保G1收集器可以在有限时间获得最高的垃圾收集效率。
原文链接:https://www.cnblogs.com/chiaki/p/13472952.html