文章目录
JVM GC
是什么:
GC:Garbage Collection(垃圾回收),是jvm中的一种术语。
GC分类:
+ 轻GC:当Eden区或者幸存区满的时候就会进行轻GC, 清理新生区
+ 重GC(Full GC): 当老年区满的时候,就会进行重GC, 清理全局
GC算法
1、复制算法
### 用堆模型图讲解:
1、新生成的对象会先到达Eden区,当Eden区满的时候,就会启动GC, 一部分对象被当成垃圾回收掉内存,另一部分幸存下来,移动至to区, 此时Eden区是空的, from 区可能都有数据 , 如果有就把from区的对象复制到to区,清空from区, from区和to区对换, 使得永久保持to区是空的。
2、如此运行,假设有一部分对象经历了15次GC依然没有死亡, 那么就会进入养老区。
复制算法优缺点;
优点
- 因为每一次GC都会把对象移动到一个幸存区中,所以就没有碎片内存
缺点:
-
因为to区要始终保持空的,这部分内存就不能用于存储,所以浪费了内存
-
复制需要一定的资源开销。
使用场景:
当对象存活率很低的时候,空间中的对象就会比较少,此时复制算法的缺点就会被缩小,此时使用合适
2、引用计数法
原理:
如图,为堆中的每个对象分别添加计数器, 用来标记此对象的引用数量,如对象A有多少个引用,对象B有多少个引用, 对象C的计数器为0,代表没有引用指向这个对象 , 这个就是垃圾,当计数器数值减到0,就会立刻被回收。
优缺点:
优点:
当计数器减到0,就会立刻清理回收。
缺点;
程序计数器本身就会占据一定的空间, 而且每一次更新指针,就会对计数器进行加减操作,频繁的操作就会增系统的开销。
3、标记清除算法:
原理:
- 对堆进行扫描, 标记存活的对象,图中有颜色的即为标记的对象
- 再次扫描堆,清除没有标记的对象,图中虚线对象为被清除的对象
- 清除完毕
优缺点:
优点:
没有浪费额外的内存空间。
缺点;
两次扫描,浪费了大量时间。
产生了碎片内存。
4、标记压缩算法:
原理:
在标记算法的基础上再增加一次扫描,用来压缩空间, 消除碎片内存。
优缺点;
优点:
消除了内存碎片
缺点:
又增加了一次扫描,加大了时间成本, 同是数据在内存里的压缩移动,也需要消耗一定的资源。