JVM - 关于GC算法

首先我们认识一下类加载器 不知道的小伙伴可以自行学习

JVM - 关于GC算法_第1张图片

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

  1. 新生代
  2. 幸存区(form,to)
  3. 老年区

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

 

GC题目:

  1. JVM的内存模型和分区 ~详细到每个区放什么?
  2. 堆里面的分区有哪些? Eden,form/to(谁空谁是to),老年区,说说他们的特点!
  3. GC的算法有哪些?标记清除法,标记压缩,复制算法
  4. 轻GC和重GC分别在什么时候发现?

引用计数法:

 NUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUllNUll

复制算法:

然后幸存区总是有一个保持零 就是说 假如两个都有东西 那么一个区就会把他的东西复制到另外一个区 然后清零 就变成了to区

JVM - 关于GC算法_第2张图片

主要的过程是这样的

JVM - 关于GC算法_第3张图片

我们可以看到新生区通过GC清楚算法 把存活对象丢进幸存区 然后form区的对象也丢进to区 这样 上面就变成from区

下面则是to区  然后紧接着继续清除 默认清楚15次后的对象还在就丢进养老区

这样的优点是 没有内存的碎片

缺点是 浪费了内存空间 总是有to这一大片空的,假设对象100%存活,实际上是不友好的,当然这是一种极端情况

 

标记清除算法(标记压缩清除):

JVM - 关于GC算法_第4张图片

JVM - 关于GC算法_第5张图片

你可能感兴趣的:(JVM)