美文网首页面试题整理
Java新生代、老生代和永久代详解

Java新生代、老生代和永久代详解

作者: Aaron_Swartz | 来源:发表于2019-10-04 18:50 被阅读0次

前言: 还是面试经常被q,小结一下

image.png

JVM中的堆一般分为三部分,新生代、老年代和永久代。

  • 1 新生代
    主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。
    新生代分为Eden区、ServivorFrom、ServivorTo三个区。

    • Eden区:Java新对象的出生地(如果新创建的对象占用内存很大则直接分配给老年代)。当Eden区内存不够的时候就会触发一次MinorGc,对新生代区进行一次垃圾回收。
    • ServivorTo:保留了一次MinorGc过程中的幸存者。
    • ServivorFrom: 上一次GC的幸存者,作为这一次GC的被扫描者。
      当JVM无法为新建对象分配内存空间的时候(Eden区满的时候),JVM触发MinorGc。因此新生代空间占用越低,MinorGc越频繁。
      MinorGC采用复制算法。
  • 2 老年代
    老年代的对象比较稳定,所以MajorGC不会频繁执行。

触发MinorGC的条件:
1 在进行MajorGC之前,一般都先进行了一次MinorGC,使得有新生代的对象进入老年代,当老年代空间不足时就会触发MajorGC。
2 当无法找到足够大的连续空间分配给新创建的较大对象时,也会触发MajorGC进行垃圾回收腾出空间。

MajorGC采用标记—清除算法(或者标记—整理算法)
MajorGC的耗时比较长,因为要先整体扫描再回收,MajorGC会产生内存碎片。为了减少内存损耗,一般需要合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出OOM。

  • 永久代
    指内存的永久保存区域,主要存放Class和Meta(元数据)的信息。
    Class在被加载的时候元数据信息会放入永久区域,但是GC不会在主程序运行的时候清除永久代的信息。所以这也导致永久代的信息会随着类加载的增多而膨胀,最终导致OOM。

注意: 在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此默认情况下元空间的大小仅仅受本地内存的大小限制。类的元数据放入 native memory, 字符串池和类的静态变量放入java堆中。 这样可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

  • MajorGC和FullGC的区别(这里参考1建议不要纠结这两个概念的区别,而是应该专注于解决问题)

    • Full GC 是清理整个堆空间—包括年轻代和老年代。
    • Major GC 是清理老年代。
  • MinorGC 触发机制

1 Eden区满的时候,JVM会触发MinorGC。

  • MajorGC 触发机制

1 在进行MajorGC之前,一般都先进行了一次MinorGC,使得有新生代的对象进入老年代,当老年代空间不足时就会触发MajorGC。
2 当无法找到足够大的连续空间分配给新创建的较大对象时(如大数组),也会触发MajorGC进行垃圾回收腾出空间。

  • Full GC触发机制:

1 调用System.gc时,系统建议执行Full GC,但是不必然执行
2 老年代空间不足
3 方法区空间不足
4 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
5 由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,
4 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载。

虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1。对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1 岁,  当它的年龄增加到一定程度(默认为 15 岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold (阈值)来设置。

参考:
1 原文: Minor GC vs Major GC vs Full GC
2 Java中的新生代、老年代、永久代和各种GC

相关文章

  • Java新生代、老生代和永久代详解

    前言: 还是面试经常被q,小结一下 JVM中的堆一般分为三部分,新生代、老年代和永久代。 1 新生代主要是用来存放...

  • 《Java深入理解虚拟机》笔记一

    JVM中的老生代与新生代 堆=新生代 + 老生代,其中新生代等于1/3的堆空间大小,老生代等于2/3堆空间的大小新...

  • 2020-08-28-Node内存控制

    V8内存 V8内部的内存对象分为新生代和老生代,新生代是代表存在时间较短,很快被释放内存空间的对象,而老生代对象则...

  • JVM GC知识(二)- HotSpot 垃圾回收器

    Sun HotSpot垃圾回收器 概览 新生代和老年代用到的一些垃圾回收器 永久代 当永久代和老年代触发 GC 时...

  • Android 垃圾回收与内存优化

    一些资料记录: 一、 java内存模型 二、 垃圾回收算法 三、 垃圾回收器对象的新生代、老年代、永久代关系 四、...

  • JVM内存分代收集策略

    Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代、老年代和永久代(对HotSpot虚拟机而...

  • java GC

    Full GC 就是收集整个堆,包括新生代,老年代,永久代(在JDK 1.8及以后,永久代会被移除,换为metas...

  • java8内存结构变化

    java8移除了永久代,增加了元空间。1)java7以前的版本Hotspot的方法区位于永久代,并且永久代和堆是互...

  • Java垃圾分代回收机制

    回收针对的是堆内存。将堆内存划分为了2块:新生代和老生代。新生代有划分为伊甸园区和幸存区。对象刚创建的时候是放在新...

  • 重温系列之JVM:GC垃圾收集器

    Java 堆内存被划分为新生代和年老代两部分,新生代主要使用复制算法 ;年老代主要使用标记-整理和标记-清除垃圾回...

网友评论

    本文标题:Java新生代、老生代和永久代详解

    本文链接:https://www.haomeiwen.com/subject/fwdspctx.html