文章目录
GC:垃圾回收
GC的作用区域
- GC的作用区域在方法区和堆
JVM在进行垃圾回收时,并不是是对伊甸园区,幸存区和老年区统一回收。大部分GC都是在新生区(伊甸园区和幸存区)
GC的类型
- 轻GC(普通GC)
- 重GC(全局GC)Full GC
模拟题目
- JVM的内存模型和分区。
- 详细到每个分区。
- 根据JVM规范,JVM 内存共分为虚拟机栈,堆,方法区,程序计数器,本地方法栈五个部分。
- 堆里面分区有哪些?
- 新生区(Eden,from,to),老年区,元空间
- 说说他们的特点?
- GC的算法有哪些?
- 标记清除法
- 压缩标记法
- 复制算法
- 引用计数器
- 如何使用?
- 轻GC和重GC分别在什么时候发生?
GC常用算法
引用计数法
- 引用计数器(假定是A对象的计数器)只要在出现对A对象的引用的时候,就将引用计数器中的值加1。当引用计数器为0时,将该对象清除。
- 计数器本身也会消耗资源
- 这种方式不高效,尤其在对象很多时候,弊端就凸显了。【好像python用的就是这种,隔代清除算法】
复制算法
-
主要针对新生代中的伊甸园区和幸存者区(from,to),复制总是从from复制到to,然后更新标记,做到让to区始终为空
-
一次轻GC结束,伊甸园区总是空的,to区(区域的标记会变化)总是空的(复制算法保证)。
-
优劣
- 好处:没有内存碎片
- 坏处:浪费内存空间,多了一半空间永远是空的To区
-
赋值算法最佳使用场景:对象存活度低的情况下,新生区的GC
标记清除算法
- 优点:不要额外的内存(空闲预留)空间
- 缺点:
- 两次扫描,浪费时间
- 会产生内存碎片
标记清除压缩算法(在标记清除的算法上,在对内存碎片进行压缩整合)
- 目的:为了将标记清除算法中产生的内存碎片整合在一起,构成可用的较大内存空间。
- 优点:可以将碎片整合,构成可用的较大内存空间
- 缺陷:
- 再扫描一次,耗时
- 移动碎片,耗时
总结
- 算法的时间复杂度:复制算法>标记清除算法>标记清除压缩算法
- 内存整齐度(看最终有无小的内存碎片):复制算法=标记清除压缩算法>标记清除算法
- 内存利用率(是否需要预留内存空间):标记清除算法=标记清除压缩算法>复制算法
分代收集算法(上述算法的混合使用)
- 没有最好的算法,只有最合适的算法
- 对于新生代:
- 对象存活率低,需要频繁的GC,
- 需要更少的时间完成->复制算法
- 对于老年代:
- 对象存活率高
- 不需要频繁的GC,更多的是考虑内存的整齐度(空间角度),不太考虑时间效率
- 使用标记清除算法(内存碎片不是太多)+标记清除压缩算法混合实现
参考自狂神说