一 标记清除算法 mark-sweep
标记对象的判定(可达性 gcroots)
不足:
1 效率问题
2 空间问题 :
标记清除之后会产生大量不连续的内存碎片, 空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时
,无法找到足够的连续内存而不得不
提前触发垃圾收集动作
二 复制算法(copying) 解决效率的问题
将可用的内存按容量分为大小相同的两块,每次只使用其中的一块,当一块用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过
的内存空间一次性清理掉,每次都只对半个区域进行内存回收,缺点是将内存缩小了一半!
现在的商业虚拟机都是采用这种算法来回收新生代:新生代98%的对象都是朝生夕死的, 并不需要按照1:1,所以eden空间尽量大,就有了新生代的 eden(8)和survivor(1),一块较大的eden区和两块较小的survivor区(新生代)
hostspot虚拟机默认的eden和survivor区的大小比例是8:1 也就是每次新生代中可用的内存空间为整个新生代容量的90%(8+1),只有10%的内存会被浪费;
三 标记整理算法 (针对老年代,复制算法不适合,存活对象多)(mark_compact)
标记 --整理(移动到端) --清楚
四 分代收集算法 分代后 新生代存货少 用复制 老年代存活高用标记整理
hostspot算法实现
可作为GCroots的节点对象主要在全局性的引用(常量或者类静态属性)与执行上下文,
为什么full GC时影响性能: 保证可达性一致性——一致性的意思是整个分析期间,整个系统看起来就像是被冻结在某个时间点上,
不可以出现
分析过程中对象引用关系还在不断变化的情况,该点不满足的话,分析结果准确性就得不到满足 stop the world
hotSpot使用一组称为OopMap的数据结构来达到这个目的,在类加载完成的时候,hotSpot就把对象内什么偏移量上是什么类型的数据计算出来。在oopMap的协助下,hotSpot能快速且准确的完成GCRoots枚举,