JAVA_GC

Posted 偶像java练习生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA_GC相关的知识,希望对你有一定的参考价值。

GC:垃圾回收机制

GC 的作用区在堆和方法区:
在这里插入图片描述

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

  1. 新生代
  2. 幸存区(from ,to) from 和to 是交替的过程
  3. 老年区
    GC 两种类:轻GC(普通的GC):针对于新生代,偶尔针对下幸存区,重GC(全局GC,所有东西都清理一遍,释放内存)

题目:
4. JVM 的内存模型和分区-详细到每个区放什么
5. 推里面的分区有哪些?Eden ,from,to,老年区,说说他们的特点
6. GC 的算法有哪些?标记清除法,标记整理法,复制算法,引用计算法,怎么用?
7. 轻GC 和重GC 分别在什么时候发生

引用计数法

在这里插入图片描述
对象引用次数为0 ,则清除
不高效

复制算法

在这里插入图片描述
好处:没有内存碎片
坏处:浪费了一个幸存区的空间:多了一半空间总是空的。假设这个对象100% 存活(极端情况)
复制算法最佳使用场景:对象存活度较低的时候:新生区

每次垃圾回收之后,Eden 区是空的,to区也是空的
在这里插入图片描述
如果在幸存区活了15 次,那么将这个对象牵制到养老区,如果没有活到,则自动离开了。

标记清除算法

优点:不需要额外的空间!
缺点:两次扫描,严重浪费时间,会产生内存碎片

标记压缩

再优化
在这里插入图片描述
压缩再次扫描:避免内存碎片,多了一个移动成本
在这里插入图片描述

再优化:先标记清除几次,在压缩,压缩。

总结

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

思考一个问题:没有一个最优的算法吗?
答案:没有最好的算法,但是只有最合适的算法。—>GC : 分代手机算法

年轻代:

  1. 存活率低
  2. 复制算法!

老年代:

  1. 区域大:存活率高
  2. 标记清除(内存碎片不是太多)+标记压缩混合实现

一天时间学JVM ,不显示,要探究,必须要下去花时间,和多看面试题,和多看面试题,以及《深入理解JVM》
但是我们可以掌握学习JVM 的方法。

以上是关于JAVA_GC的主要内容,如果未能解决你的问题,请参考以下文章