GC:垃圾回收
回收地方:堆和方法区
JVM在进行GC时,并不是对这三个区域(新生代,幸存区,老年代)统一回收,大部分回收在新生代。
GC两种类:轻GC,重GC
轻GC主要是新生代,偶尔在幸存区。重GC全部清理(释放内存)
引用计数法

引用计数法,会给每一个对象都分配一个计数器,对象被使用过1次则为1,对象如果没有被使用过为0,为0的对象最后会被GC垃圾回收
缺点:对象间的循环引用无法解决,且计数器的分配和计算消耗。
class Person{
public Person lover = null;//定义一个爱人
private String name = "";//姓名
Person(String name){
this.name = name;
}
}
public class Demo {
public static void main(String[] args) {
Person liangshanbo = new Person("梁山伯");//创建一个人物:梁山伯
Person zhuyingtai = new Person("祝英台");//创建一个人物:祝英台
liangshanbo.lover = zhuyingtai;//设置梁山伯的爱人是祝英台
zhuyingtai.lover = liangshanbo;//设置祝英台的爱人是梁山伯
}
}
两个对象是互相引用的,Java无法根据计数器为0来判断哪个对象引用为0,所以两个对象都没有去回收。
复制算法

幸存0区和幸存1区,不断交换,谁空谁是to。
to区永远都是干净的。
当一个对象经历了默认GC垃圾回收15次还没有死,就会进入养老区。
由于两个幸存区不断复制,所以新生区使用的是复制算法
好处:没有内存碎片
坏处:to区总是空的浪费了内存空间
假设对象存活率过高,复制算法效率就会降低
标记清除算法

优点:不需要额外空闲的内存空间
缺点:两次扫描浪费时间,并且产生内存碎片
标记压缩算法:先标记清除几次,在进行压缩
- 在标记清除算法之上,在进行扫描一次
- 被标记使用过的对象,往前移动,内存碎片往后移动
- 连续的内存碎片不是内存碎片
缺点:再次扫描一次,并且多了移动成本
优点:没有内存碎片了
总结
- 内存效率: 复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度)
- 内存整齐度: 复制算法 = 标记压缩算法 > 标记清除算法
- 内存利用率: 标记压缩算法 = 标记清除算法 > 复制算法
没有最好的算法,只有最合适的算法
年轻代:
存活率低
复制算法
老年代:
存活率高
标记清除+标记压缩算法(内存碎片达到一定的值,进行压缩,jvm调优)
本文详细解析了Java中垃圾回收的基本概念,包括轻GC和重GC的工作原理,以及复制算法、标记清除算法和标记压缩算法的特点。通过对比不同算法的优缺点,帮助读者理解年轻代和老年代分别适用的垃圾回收策略。
1508

被折叠的 条评论
为什么被折叠?



