如何判断一个对象已死
(1)引用计数器法
(2)可达性分析
在java语言中,可以作为GC root的对象包括如下:
《1》虚拟机栈中的引用的对象。
《2》方法区静态属性引用的对象。
《3》方法区中常量引用的对象。
《4》本地方法中引用的对象。
引用
《1》强引用:是JVM普遍存在的,如Object a = new Object(); 只要强引用还存在,永远不会被回收。
《2》软引用:描述还有用但是非必须的对象。对于这类引用对象,在系统发生内存溢出之前,将会把这些对象列进回收范围之中进行第二次回收。
《3》弱引用:比软引用弱,只生存到下一次垃圾回收发生之前。当发生gc,这类对象就会被回收。
《4》虚引用:这类引用最弱,完全不对其生命周期存在影响,存在的目的是在这个对象在回收时候收到一个系统通知。
这四种引用强度依次减弱。
垃圾回收算法
一、标记-清除算法
效率低,内存碎片化。
二、复制算法
浪费空间,主要使用在年轻代
三、标记整理算法
主要使用在老年代
四、分代收集算法
垃圾收集器
Serial
(1)特点
——它是单线程进行垃圾回收
——独占式的垃圾回收
——进行垃圾回收的时候,java应用程序中的线程都需要暂停等待。
——使用的是复制算法
——适合CPU等硬件不是很好的场合
ParNew
(1)特点
——多线程进行垃圾回收
——回收的时候也会出现所有线程暂停,但是是多线程的,所有暂停短暂,但是在单核CPU上,效率还不如单线程,由于线程切换。
——使用的是复制算法
ParallelGC
(1)特点
——和ParNew原理是一样的,只是多了关注系统吞吐量
——使用的复制算法
——支持使用自适应的GC调节策略
CMS收集器
(1)特点
——属于老年代并发收集器
——是并发回收,非独占式的收集器,大部分应用程序不会停止
——使用并发标记清除算法,回收后会存在内存碎片,可以使用参数设置针对内存碎片进行压缩整理
——与ParallelGC和ParallelOldGC不一样,主要关注系统的停顿时间
G1收集器
(1)特点:
——独特的垃圾回收策略, 属于分代垃圾回收器,
——使用分区算法, 不要求eden, 年轻代或老年代的空间都连续
——并行性: 回收期间, 可由多个线程同时工作, 有效利用多核cpu资源
——并发性: 与应用程序可交替执行, 部分工作可以和应用程序同时执行,
——分代GC: 分代收集器, 同时兼顾年轻代和老年代
——空间整理: 回收过程中, 会进行适当对象移动, 减少空间碎片
——可预见性: G1可选取部分区域进行回收, 可以缩小回收范围, 减少全局停顿
(2)G1的收集过程
1. 新生代GC:
2. 并发标记周期:
——初始标记新生代GC(此时是并行, 应用程序会暂停止)–>根区域扫描–>并发标记–>重新标记(此时是并行, 应用程序会暂停止)–>独占清理(此时应用程序会暂停止)–>并发清理
3. 混合回收:
——这个阶段即会执行正常的年轻代gc, 也会选取一些被标记的老年代区域进行回收, 同时处理新生代和年老轻
4. 若需要, 会进行FullGC:
——混合GC时发生空间不足
——在新生代GC时, survivor区和老年代无法容纳幸存对象时,
——以上两者都会导致一次FullGC产生