知其然,知其所以然
垃圾回收算法与垃圾回收器
GC如何判断对象的存活
GC判断对象存活的方式:引用计数算法、可达性分析。
引用计数法:如果对象有一个引用的话,就给他进行一次+1,当GC发现这个对象引用次数是0的话,就把这个对象当成死了,之后将其回收。缺陷:如果A.instance = B 同时 B.instance = A,这种互相引用就会被GC判断成有用对象,便不会回收,但实际上AB均为无用对象。
可达性分析:如果对象有GC roots的引用,变不会回收。在Java中,可以作为GC Roots的对象包括:
1.方法区中类静态属性引用的对象;
2.方法区中常量引用的对象;
3.虚拟机栈(本地变量表)中引用的对象;
4.本地方法栈JNI(native方法)中引用的对象。
引用(Reference):指Reference中存储的数据代表的是另一块内存的起始地址。
各种引用 :引用又在后续的发展中延伸成四种引用
1.强引用(=):强引用就是一个等号
例:Object obj2 = obj1,这种就属于一个强引用。
2.软引用(SoftReference):尽可能保证不会被垃圾回收器回收,但是在内存不足的时候就会被回收。
例:
//实例化一个学号是007,姓名是张三的对象 ,new也是强引用
User user = new User(007,"张三");
//软引用
SoftReference<User> userSoft = new SoftReference<~>(user);
//把user置空,干掉强引用,确保该实例只有userSoft软引用
user = null;
3.弱引用(WeakReference):在每一次进行GC回收的时候就会被清除掉。ThreadLock、weakHashMap也属于弱引用。
4.虚引用(PhantomReference):幽灵引用,一般业务里用不着,也不知道什么时候就会被回收了。
如上图:obj1、2、3、4均和GC Roots有关,变不会被回收,而Object5.6.7就会被回收。
finalize:可以拯救对象不会被回收,但是虚拟机可能不会调用这个方法。慎用!
内存回收
GC:Garbage collection
内存回收分为两种:Minor GC 、Full GC 。
首先要知道什么时候会触发GC?
当虚拟机内存不足的时候就会触发。
Minor GC : 新生代不足的时候就会触发Minor GC。
Full GC :老年代不足的时候会触发Full GC,同时Full GC触发时,会回收新生代中的无用对象。
垃圾回收算法
在Java中,垃圾回收算法只有三种:复制算法、标记-清除算法、标记整理算法。
复制算法:新生代(form to 两个交换区)中使用,直接把左边红色块的复制到右边蓝色块,于是左边又空出来了,右边有两个红色块。
优点:简单高效,不会出现内存碎片问题
缺点:内存利用与低,只有一半;存活对象较多的时候明显效率低。
标记-清除算法:如标题而言,首先去标记灰色区域,然后清除掉灰色区域。
优点:利用率百分百。
缺点:标记和清除的效率(该效率是相比复制算法而言)都不高;会产生大量的不连续的内存碎片。
标记-整理算法 :如上图,在标记完灰色区域后,然后清除灰色区域,然后整理一次红色区域。
优点:利用率百分百;没有内存碎片
缺点:标记和清除的效率都不高。
垃圾回收器
垃圾回收器采用分代收集的方式回收垃圾。
新生代中垃圾回收器
收集器 | 收集对象和算法 | 收集器类型 |
---|---|---|
Serial | 新生代,复制算法 | 单线程 |
ParNew | 新生代,复制算法 | 并行的多线程收集器 |
Parallel Scavenge | 新生代,复制算法 | 并行的多线程收集器 |
老年代中垃圾回收器
收集器 | 收集对象和算法 | 收集器类型 |
---|---|---|
Serial old | 老年代,标记整理算法 | 单线程 |
Parallelold | 老年代,标记整理算法 | 并行的多线程收集器 |
CMS | 老年代,标记清除算法 | 并行的与并发收集器 |
跨越新生代和老年代的垃圾回收器
收集器 | 收集对象和算法 | 收集器类型 |
---|---|---|
G1 | 跨越新生代和老年代,标记整理和化整为零算法 | 并行的与并发收集器 |
并行:垃圾收集的多线程同时进行。
并发:垃圾收集的多线程和应用的多线程同时进行。
关系图:
CMS垃圾回收器:并行收集和并发收集,该垃圾回收器会有四步骤:
1.初始标记(会暂停所有的线程)
2.并发标记(同时进行)
3.重新标记(会暂停所有的线程)
4.并发清除(同时进行)
缺点:CPU资源消耗较高,会产生较多的内存碎片,会产生浮动垃圾。
G1垃圾回收器(Garbadge First Collector):
改变了内存布局方式。
特点:
空间整合,不会产生内存碎片:跟算法有关,它采用的是标记整理算法。
可预测的停顿:可以尽可能的控制虚拟机停顿的时间。(该值可以设置)
G1 GC模式:
Young GC:可以勉强假想成Minor GC,对应Eden、Survivor区域进行回收
Mixed GC:可以勉强假想成Full GC,会对对象进行全局并发标记。
回收四步骤:
1.初始标记;
2.并发标记;
3.最终标记;
4.回收。