文章目录
GC [垃圾回收]
作用区域:堆、方法区【特殊堆】
堆里面一般分区:
- 新生代/伊甸园区
- 幸存区 (from、to)
- 老年代
- 元空间/永久区
GC回收的区域一般在:
- 新生代/伊甸园区
- 幸存区 (from、to)
- 老年代
GC回收99%的情况在 新生区
年轻代的GC一般用复制算法 。
每次GC 都会将Eden活的对象移到幸存区中,并且Eden区被清空
幸存区 复制出来一个空的,将其中一个复制到另一个幸存区中。 谁空谁是to
白话理解: Eden存活对象复制到 幸存to区,同时 from区存活对象也复制到to区。保证有个一个幸存区永远是空的。也就是谁空谁是to 也就出现了 from 和 to 会互换。
默认当一个对象经历15次GC 会进入养老区。
-XX:MaxtenuingThreshold 当新手代对象通过指定的次数就能进入老年代,默认为15.
GC一般有两种: 轻GC (又称:普通GC),和重GC (又称:全局GC)
注:轻GC一般发生在 新生代和幸存区,重GC一般发生在老年代
GC算法的评判标准
GC算法的评判标准主要是以下4点:
- 吞吐量:即单位时间内的处理能力。
- 最大暂停时间:因执行GC而暂停执行程序所需的时间。
- 堆的使用效率:鱼与熊掌不可兼得,堆使用效率和吞吐量、最大暂停时间是不可能同时满足的。即可用的堆越大,GC运行越快;相反,想要利用有限的堆,GC花费的时间就越长。
- 访问的局部性:在存储器的层级构造中,我们知道越是高速存取的存储器容量会越小。由于程序的局部性原理,将经常用到的数据放在堆中较近的位置,可以提高程序的运行效率。
GC的算法:
- 标记清除法
- 标记压缩
- 复制算法
- 引用计数法
可达性
所谓的可达性就是通过一系列称为“GC Roots”的对象为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时&