如下内容摘自百度-知道,主要是以为能够很好的理解,因此进行了copy经常使用的GC算法:1)标记非活动对象--何为非活动对象,通俗的讲,就是无引用的对象。追踪root对象算法: 深度追踪root对象,将heap中全部被引用到的root作标志,全部未被标志的对象视为非活动对象,所占用的空间视为非活动内存。2)清理非活动对象Copy算法: 方法:将内存分为两个区域(from space和to space)。全部的对象分配内存都分配到from space。在清理非活动对象阶段,把全部标志为活动的对象,copy到to space,以后清楚from space空间。而后互换from sapce和to space的身份。既原先的from space变成to sapce,原先的to space变成from space。每次清理,重复上述过程。优势:copy算法不理会非活动对象,copy数量仅仅取决为活动对象的数量。而且在copy的同时,整理了heap空间,即,to space的空间使用始终是连续的,内存使用效率获得提升。缺点:划分from space和to space,内存的使用率是1/2。 Compaction算法: 方法:在清理非活动对象阶段,删除非活动对象占用内存,而且把活动对象向heap的底部移动,直到全部的活动对象被移到heap的一侧。 优势:无须划分from sapce和to space,提升内存的使用率。而且compaction后的内存空间也是连续分配的。 缺点:该算法相对比较复杂。 sun jdk gc介绍:在减小gc以前,先来看看来自IBM的一组统计数据:98%的java对象,在建立以后不久就变成了非活动对象;只有2%的对象,会在长时间一直处于活动状态。若是能对这两种对象区分对象,那么会提交GC的效率。在sun jdk gc中(具体的说,是在jdk1.4以后的版本),提出了不一样生命周期的GC策略。young generation: 生命周期很短的对象,归为young generation。因为生命周期很短,这部分对象在gc的时候,很大部分的对象已经成为非活动对象。所以针对young generation的对象,采用copy算法,只须要将少许的存活下来的对象copy到to space。存活的对象数量越少,那么copy算法的效率越高。 young generation的gc称为minor gc。通过数次minor gc,依旧存活的对象,将被移出young generation,移到tenured generation(下面将会介绍)young generation分为: eden:每当对象建立的时候,老是被分配在这个区域 survivor1:copy算法中的from space survivor2:copy算法中的to sapce (备注:其中survivor1和survivor2的身份在每次minor gc后被互换) minor gc的时候,会把eden+survivor1(2)的对象copy到survivor2(1)去。 tenured generation: 生命周期较常的对象,纳入到tenured generation。通常是通过屡次minor gc,还 依旧存活的对象,将移入到tenured generation。(固然,在minor gc中若是存活的对象的超过survivor的容量,放不下的对象会直接移入到tenured generation) tenured generation的gc称为major gc,就是一般说的full gc。采用compactiion算法。因为tenured generaion区域比较大,并且一般对象生命周期都比较常,compaction须要必定时间。因此这部分的gc时间比较长。 minor gc可能引起full gc。当eden+from space的空间大于tenured generation区的剩余空间时,会引起full gc。这是悲观算法,要确保eden+from space的对象若是都存活,必须有足够的tenured generation空间存放这些对象。 Permanet Generation: 该区域比较稳定,主要用于存放classloader信息,好比类信息和method信息。 对于spring hibernate这些须要动态类型支持的框架,这个区域须要足够的空间。 这部份内容相对比较理论,能够结合jstat,jmap等命令(固然也可使用jconsole,jprofile,gciewer等工具),观察jdk gc的状况