Java垃圾回收机制(GC)
一、判断哪些对象需要被回收
1. 引用计数法
基本思想:每个对象都有一个引用计数器,当关于该对象的引用增加时,引用计数器加1,减少时,引用计数器减1.如果某个对象引用数变为0,则表示该对象可以被垃圾回收器回收。
缺点:如果出现A和B之间循环引用,则两个对象都不会被回收
2. root搜索法 (jvm使用)
基本思想:root节点是jvm不会回收的对象,如果其他节点有到root节点的路径,则不会被回收,没有就会被垃圾回收器回收。
root节点定义:
* 被启动类(bootstrap加载器)加载的类和创建的对象
* jvm运行时方法区类静态变量(static)引用的对象
* jvm运行时方法去常量池引用的对象
* jvm当前运行线程中的虚拟机栈变量表引用的对象
* 本地方法栈中(jni)引用的对象
Java中的四种引用:
* 强引用:如果引用对象root可达,则一定不会被回收。
* 弱引用:即使引用对象root可达,当jvm堆内存不够的时候还是会被回收。
* 软引用:不管引用对象是否root可达,在内存不够的时候,有垃圾回收器判断是否回收。
* 引用:在回收器确定其指示对象可另外回收之后,被加入垃圾回收队列
二、垃圾回收算法
1. 标记-清除法
基本思想:标记出可以回收的对象,将其清除。
缺点:留下很多内存碎片。
2. 标记-清除-压缩法
基本思想:标记处可以回收的对象,对内存的碎片进行整理。
优点:内存无碎片
缺点:效率不高
3. 标记-清除-复制法
基本思想:将内存分为两个区域,A和B,A负责装载运行时的对象信息,B专门用于垃圾回收。当需要进行垃圾回收时,首先将A中需要保留的对象信息复制到B中,然后将A全部删除。
优点:内存无碎片,效率比2高,适合短生存期对象
缺点:需要两块空间,对内存要求高,内存利用率低
4. 并行标记清除
基本思想:使用多线程,创建多个垃圾回收线程,并行得对垃圾进行标记清除。
5. 并发标记清除
基本思想:所谓并发,就是应用程序和垃圾回收可以同时执行。标记清除算法中,在标记对象和清除对象,以及压缩对象的情况下是需要暂停应用的。那么并行标记清除压缩算法则是在标记清除压缩算法的基础上,把标记清除压缩算法分为以下几个过程:初始标记->并发标记->重新标记->并发清除->重置