Java速记手册

JVM02——JVM运行时内存

2020-03-08  本文已影响0人  Java面典

在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存。关注我的公众号「Java面典」了解更多 Java 相关知识点。

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区,默认情况下年轻代按照 8 : 1 : 1 的比例来分配)和老年代。

Java堆.png

新生代

Eden 区

Eden 区是大部分 Java 对象的初始创建区域(如果新创建的对象占用内存很大,将被直接分配到老年代)。

ServivorFrom

上一次 MinorGC 的幸存者,作为这一次 MinorGC 的被扫描区域。

ServivorTo

保留 MinorGC 过程中的幸存者。

MinorGC 实现过程(复制->清空->互换)

MinorGC 采用复制算法,其具体实现原理如下:

  1. Eden、ServicorFrom 对象复制到 ServicorTo,对象年龄 + 1。首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄达到了进入老年代的标准【对象年龄为 15 】,则复制到老年代),同时把这些对象的年龄 + 1(如果 ServicorTo 内存空间不够了,对象则会被复制到老年区);
  2. 清空 Eden、ServicorFrom 中的对象。
  3. ServicorTo 和 ServicorFrom 互换。ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom 区。

老年代

老年代GC触发条件

MajorGC实现过程

MajorGC 采用标记清除算法,其原理如下:

  1. 首先扫描一次所有老年代,标记出存活的对象;
  2. 然后回收没有标记的对象。

关于 MajorGC有以下几点需要您注意的:

  1. 由于要扫描再回收,所以 MajorGC 的耗时比较长;
  2. MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配;
  3. 当老年代也满了装不下的时候,就会抛出 OOM(Out Of Memory)异常。`

永久代

Java8 与元数据

在 Java8 中,已经没有了永久代的概念,而是出现一个新的被称为“元数据区”(元空间)的区域。元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:

JVM系列推荐

JVM01——JVM内存区域的构成

上一篇 下一篇

猜你喜欢

热点阅读