1、如何肯定一个对象是垃圾算法
1.引用计数法服务器
public static void main(String[] args){多线程
Object object1=new Object();并发
Object object2=new Object();spa
object1.object=object2; 线程
object2.object=object1;对象
object1=null;资源
object2=null;虚拟机
}it
互相引用致使object1和object2都没法被视为垃圾
2.可达性分析
垃圾收集算法是垃圾收集器的理论基础,而垃圾收集器就是其具体实现。下面介绍HotSpot虚拟机提供的几种垃圾收集器。
最古老的收集器,是一个单线程收集器,用它进行垃圾回收时,必须暂停全部用户线程。Serial是针对新生代的收集器,采用Copying算法;而Serial Old是针对老生代的收集器,采用Mark-Compact算法。优势是简单高效,缺点是须要暂停用户线程。
Seral/Serial Old的多线程版本,使用多个线程进行垃圾收集。
新生代的并行收集器,回收期间不须要暂停其余线程,采用Copying算法。该收集器与前两个收集器不一样,主要为了达到一个可控的吞吐量。
Parallel Scavenge的老生代版本,采用Mark-Compact算法和多线程。
Current Mark Sweep收集器是一种以最小回收时间停顿为目标的并发回收器,于是采用Mark-Sweep算法。
CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来得到最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器很是适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。
缺点:
1)CMS收集器对CPU资源很是敏感。在并发阶段,它虽然不会致使用户线程停顿,可是会由于占用了一部分线程而致使应用程序变慢,总吞吐量会下降。
2)CMS收集器没法处理浮动垃圾,可能会出现“Concurrent Mode Failure(并发模式故障)”失败而致使Full GC产生。
浮动垃圾:因为CMS并发清理阶段用户线程还在运行着,伴随着程序运行天然就会有新的垃圾不断产生,这部分垃圾出现的标记过程以后,CMS没法在当次收集中处理掉它们,只好留待下一次GC中再清理。这些垃圾就是“浮动垃圾”。
3)CMS是一款“标记--清除”算法实现的收集器,容易出现大量空间碎片。当空间碎片过多,将会给大对象分配带来很大的麻烦,每每会出现老年代还有很大空间剩余,可是没法找到足够大的连续空间来分配当前对象,不得不提早触发一次Full GC。
G1(Garbage First)收集器技术的前沿成果,是面向服务端的收集器,能充分利用CPU和多核环境。是一款并行与并发收集器,它可以创建可预测的停顿时间模型。