JVM的GC笔记(初始,有想法随时更新)
JVM在进行GC时,并不是统一回收,大部分是在新生代
- 新生代
- 幸存区 ( from , to )
- 老年区
GC两种类型:轻GC ,重GC
举例题目:
- JVM的内存模型和分区,详细到每个区放什么?
- 堆里面的分区有哪些?Eden,from,to,老年区
- GC的算法常见有:标记清除算法,标记压缩,复制算法,引用计数器。怎么用的?
- 轻GC和重GC分别在什么时候发生?
复制算法:
没有碎片,但浪费空间,也就是to区永远空。(假如对象100%存活,那么Eden区就会全部被拷贝到from区,成本过高了。)
复制算法最佳使用场景:对象存活度较低,也就是适合新生区。
标记清除算法:
两次扫描严重浪费时间,会产生内存碎片。但是不需要额外的空间。
标记压缩算法(优化标记清除算法)
防止了内存碎片产生,再次扫描,向一段移动获得对象,多了一个移动成本。
总结
内存效率: 复制算法>标记清除算法>标记压缩算法
内存整齐度: 复制算法=标记压缩>标记清楚算法
内存利用率: 标记压缩算法=标记清除算法>复制算法
- 年轻代:存活率低,复制算法。
- 老年代:区域大,存活率高,标记清除+标记压缩。
所谓JVM调优就是调这些量;