JDK1.8-GC垃圾回收算法
2021-03-18 本文已影响0人
Wannay
- 次数上频繁收集Young区,次数上较少收集Old区,基本不动元空间。
- GC和FGC的区别:
- GC是指新生代的垃圾回收,GC很频繁,因为大多数的Java对象存活时间都很短,所以GC的回收速度很快、也很频繁。
- FGC是指养老区(Old)的垃圾回收,GC回收速度不频繁,也不快,因为要扫描整个老年区的空间,所以它的速度比GC慢10倍左右。
- GC的四大算法
- 1.引用计数法
- 2.复制算法(Copying)
- 3.标记清除(Mark-Swap)
- 4.标记压缩(Mark-Compact)
1.引用计数法
- JVM的实现一般不使用这种方法,应用在微软的COM/ActionScript3/Python...
- 有被引用这个对象,计数器就+1,没有被引用的就被回收了
- 缺点如下:
- 1.每次对对象进行赋值的时候都要将计数器+1,且计数器本身也有消耗
- 2.较难处理循环引用(A引用B,B引用A)
System.gc(); //手动唤醒GC,禁用手动GC,JDK1.8的垃圾回收已经很智能了
//不是立刻执行,也是要看系统的调度,类似创建了线程,也不是立刻执行,得看系统的调度
只有main方法,后台有几个线程?两个,一个main,一个GC
public class Main {
public static void main(String[] args) {
}
}
2.复制算法
- 新生代(Young)中使用的GC就是使用的复制算法。
-XX:MaxTenuringThreshold //设置对象再新生代中存活代数,默认是15
- 复制算法的基本思想是将内存分为两块,每次只用其中一块,这块内存用完,就将或者的对象复制到另外一块上去。复制算法不会产生内存碎片,但是耗空间。
- 从根集合(GC ROOT)开始,通过Tracing从FROM区找到存活对象,拷贝到TO区中;FROM区和TO区交换,下次内存分配继续从TO开始。
3.标记清除算法
- 思想是:先从内存中标记出来要回收的对象,然后进行统一回收。
- 标记清除算法空间节约出来了,但是会产生内存碎片。而且要扫描两次,一次标记,一次清除,浪费了时间。
4.标记压缩算法
- 思想是:先从内存中标记出来要回收的对象,然后进行统一回收,之后对剩下来的存活的对象进行整理(丢在同一侧)
- 缺点:效率不高,需要一定对象的成本,耗时比较严重。
- 改进:标记-清除-压缩算法:标记清除和标记压缩算法的折中,进行多次的GC后才压缩。
JVM的GC用的是哪种方法?
新生代GC使用复制算法,在老年代FGC使用标记压缩、标记清除算法