判断对象什么时候回收

一般有两种方法,分别是引用计数法和可达性分析法。
引用计数法 一个对象被引用一次,就在当前对象上递增一次引用次数,如果对象引用次数为0则可回收。但是如果两个对象循环引用,会导致该方法失效。
可达性分析法 基于“GC Roots”的对象图,从GC Roots开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC Roots没有任何引用链相连时,则该对象可回收。现在的虚拟机都是采用该方法进行对象回收的判断。

GC算法

一般有三种方法,分别是引用计数法和可达性分析法。
标记清除算法 在内存中将需要存活的对象做出标记,那么没被标记的对象就是可以回收的对象。效率较高,但是会留下大量的内存碎片不能好好利用。
标记整理算法 为了利用清楚算法残留的内存碎片,将存活对象移动到内存的一端,然后清理掉端边界以外的内存。这样留下了大块的内存,但是需要移动对象,效率较低。
标记复制算法 将内存分成两等块,每次只使用其中一块,当一块内存用完后,将存活对象复制到另一块内存中,然后将第一块内存清空。可以有哦小利用内存,但是每次只使用内存的一半,对内存的使用率低。

分代回收

java1.8版本后的堆中有新生代和老年代,内存占用比例大概是1:2。在新生代的内存中有分为三个区域,eden区和两个幸存者区,内存比例大概是8:1:1.
在新生代中,新创建的对象会分配到eden区,当eden区内存不足的时候,会使用可达性分析法判断存活对象,并把该对象放入其中一个幸存者区中。当eden区又接收了很多新对象内存不足时,会使用可行性分析法判断存活对象,并把edne的存活对象和第一个幸存区的存活对象一起放到第二个幸存者区中。当处于幸存者区的对象经历最多15次回收后还存活,会把该对象存入老年代。
MinorGC 一般发生在新生代的垃圾回收,stop the world(会暂停所有线程,进行标记整理算法)的时间会很快,效率高
MixedGC 一般发生在新生代和老年代部分区域的垃圾回收,以G1收集器。
FullGC 一般是新生代和老年代的完整垃圾回收,stw时间很长。

垃圾回收器盘点

串行垃圾回收器 一般由 SerialSerial Old 组成,Serial作用于新生代,采用复制算法,Serial Old作用于老年代,采用标记整理算法。在垃圾回收时只有一个线程可以工作,其他线程都需stw。
并行垃圾回收器 一般由 Parallel NewParallel Old 组成,Parallel New作用于新生代,采用复制算法,Parallel Old作用于老年代,采用标记整理算法。在垃圾回收时多个线程可以进行回收工作,其他线程都需stw。
并发垃圾回收器(CMS) 使用标记清除算法,并发对老年代垃圾进行回收。首先回收的线程会进行初始标记,这时其他线程会进入stw状态,之后进入并发标记,并发标记时剩下线程可以正常运行。并发标记过后所有线程都需进行重新标记,最后回收线程进行清理,其他线程正常运行。
G1垃圾回收器 应用于新生代和老年代,在JDK9后默认使用G1.划分了多个区域,分为eden,survivor,old,humongous四个区域,其中humongous专为大对象准备。采用复制算法,分为新生代回收,并发标记,混合收集三个阶段。如并发失败会出发Full GC.