无名 发表于 2022-5-8 18:42:20

【HC】垃圾回收机(java)

定义:

垃圾收集器 (Garbage Collection, GC):
自动寻找收集无用的内存,并提供一种内存的管理机制,使开发者无序手动释放内存1。

也就是说,GC具备两项基本功能:
1. 检测无效内存
2. 清除无效内存。

Level 2

检测无效内存

检测出系统无效内存有引用计数法和可达性分析算法:

引用计数法:
给对象添加一个计数器(ref_cnt),通过增减计数器的值来判定对象是否为无效对象。分配内存空间时,对象计数器值+1,在更新指针的过程中,新应用对象的计数器值+1,同时指针原先对象的计数器值-1。如果计数器值为0,则被视为垃圾(无效内存)。
弊端:假如数个对象相互引用,成为闭环,计数器无法检测。
可达性分析:
以根对象作为起始点进行遍历搜索,如果有对象无引用,则该对象为垃圾。
Level 3

如何清除无效内存与垃圾收集算法有关。

垃圾收集算法

标记-清除算法(Mark-Sweep)
递归每个能访问的对象的指针数组,将每个活动对象打上mark; 将不能活动的对象进行回收; 标记-整理算法: 标记-清除的升级版; 将标记的对象移入一侧,然后清掉端边界外的内存; (在存活率较高的情况下更为高效, 且耗空间更小)(此两种方法适用于存活率高的对象, 比如旧生代中的对象);

复制算法(Copying)
将内存空间等分成大小相同的两份,执行GC时候,将当前空间的活动对象复制至另一空间,复制完成后,回收当前空间。复制的时候先将原有对象打上copy标签,指向新空间的对象。
标记整理。

标记-整理算法(Mark-Compact)
标记-清除算法的升级版。标记过程与前者一致。但后面不是简单的清除,而是让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

分代收集算法
目前商用虚拟机常用的垃圾收集算法。JVM虚拟机中不同的区域(年轻代,老年代)使用不同的垃圾收集算法。年轻代对象生命周期较短,用Minor GC;老年代生命周期稍长,用Major GC。
http://cdn.u1.huluxia.com/g3/M02/33/33/wKgBOV3GAZaAG8n3AAB7RTr-mbc147.jpg
页: [1]
查看完整版本: 【HC】垃圾回收机(java)