垃圾回收

垃圾回收:解放对内存管理的繁杂工作

垃圾检测策略:

1.引用计数:JDK1.2之前,count对象被引用的次数,引用次数为0被认为为可回收,无法解决循环引用的问题

2.根搜索法:通过GC Root搜索对象的引用链,当一个对象没有任何引用链则判定为可回收

Java中的引用:

强引用:Object o = new Object(); 垃圾回收器永远不回收

软引用:用SoftReference来描述一些非必须对象,系统内存溢出之前会将这些对象列入回收范围

弱引用:用WeakReference来描述一些非必须对象,系统在垃圾回收时进行回收

虚引用:用PhantomReference来描述一个对象,无法通过引用获得对象,仅仅是对象被回收时收到一个系统通知

垃圾回收算法:

1.标记-清除:通过根搜索标记后清除不需要的对象,效率低,会产生内存碎片

适合年老代垃圾回收:CMS收集器

2.标记-整理:将存活的对象向一端移动,然后清除边界以外的内存,解决了内存碎片的问题,但整理需要一定的时间

适合年老代垃圾回收:如Serial Old收集器

3.复制回收:将内存等分为两等分A,B,将不能回收的对象在A,B之间来回拷贝,解决了内存碎片的问题,但降低了内存利用率

适合新生代垃圾回收:如Serial New收集器,根据新生代朝生夕死的特点,将新生代划分为8:1的Eden,Survivor,并将Survivor划分为两等分,将未被回收的对象在S0和S1之间来回拷贝,提高内存利用率

垃圾回收器:

垃圾回收算法是内存回收的方法论,垃圾回收器是内存回收的具体实现

分代回收策略:将内存划分为几个区域,各区域采用合适的回收算法,Java中分为新生代和年老代

垃圾回收方式:

串行回收:单线程,GC停顿时间长,适合小型应用   

并发回收:多线程,GC停顿时间短,回收效率高,适合高吞吐应用  

并行回收:多线程,不影响工作线程,回收效率高,适合响应时间优先应用    

Minor GC:Eden区空间不够

FullGC:清理新生代+年老代,老年代空间不足时触发

常见垃圾回收器:

Serial收集器:最基本,最悠久的垃圾收集器,单线程,Client模式下默认的新生代垃圾收集器

ParNew收集器:是Serial收集器的多线程版本,Server模式下首选的新生代垃圾收集器,能与CMS收集器搭配使用

Parallel收集器:使用复制回收算法的新生代垃圾收集器,多线程,适合高吞吐应用,可以控制吞吐量和垃圾收集停顿时间

Serial Old收集器:使用标记整理算法的年老代垃圾收集器,单线程,主要Client模式下使用,Server模式时作为CMS收集器发生Concurrent Model Failure时的预备方案

Parallel Old收集器:使用标记整理算法的年老代垃圾收集器,是Parallel收集器的年老代版本

CMS(Concurrent Mark Sweep)收集器:以最短回收停顿为目标的收集器,在互联网站或B/S系统上大量使用,基于标记清除算法实现

缺点:1.对CPU资源非常敏感

           2.无法回收浮动垃圾,发生Concurrent Model Failure 异常而导致另一次FullGC

           3.产生内存碎片

G1收集器:对新生代和年老代不再进行物理隔离,而是采用Region划分内存空间,根据优先级进行垃圾回收,保证在有限的停顿时间内进行最有效的垃圾回收


垃圾回收器选择与调优:

你可能感兴趣的:(垃圾回收)