JVM 虚拟机 GC

GC

JVM 虚拟机

JVM 在进行GC时,并不是对这三个区域统一回收,大部分回收都是在新生代

  • 新生代
  • 幸存区(from,to)
  • 老年代

GC两种类型:轻GC(普通GC),重GC(全局GC)

当一个对象经历了15次GC,都没有死就会进入养老区域
JVM设定GC老年代次数:-XX:MaxTenuringThreahold=5
通过这个参数,可以设定进入老年代的时间

JVM 虚拟机

Eden:from:to = 8:1:1

  • JVM的内存模型~详细到每个区放什么?
  • 堆里面的分区有哪些?Eden,from,to,老年区,说说特点
  • GC算法?标记清除法,标记压缩,复制算法,引用计数,怎么用
  • 轻GC和重GC分别在什么时候发生

引用计数法:

JVM 虚拟机

复制算法:

是针对Eden,from和to区域及年轻代

对于from和to如何区别?
谁空谁是to

  1. 每次GC都会将Eden活着的对象移到幸存区中:一旦Eden区被GC后,就会是空的!
  2. from和to区域是互相交替的,会将from区的对象,复制到to中,然后from中就会空的。此时from就会变为to,to变为from

JVM 虚拟机

  • 好处:没有内存的碎片
  • 坏处:浪费了内存空间:多了一半空间永远是空to,假设对象100%存活(极端情况)OOM
    复制算法最佳使用场景:对象存活度较低;新生区使用

标记清除法

JVM 虚拟机

  • 缺点:两次扫描严重浪费时间,或产生碎片。
  • 优点:不需要额外的空间

标记压缩

再优化:
多了移动成本
JVM 虚拟机

##总结
内存效率:复制算法>标记清除法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩>标记清除法
内存利用率:标记压缩=标记清除>复制算法

没有最好的算法,只有最合适的算法—->GC:分代收集算法

年轻代:

  • 存活率低:复制算法
    老年代:
  • 区域大:存活率高
  • 标记清除+标记压缩混合实现
JVM
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!