美文网首页
JVM的新生代、老年代、MinorGC、MajorGC

JVM的新生代、老年代、MinorGC、MajorGC

作者: JAVA架构师的圈子 | 来源:发表于2021-01-03 21:32 被阅读0次

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

在这里插入图片描述

一:新生代:主要是用来存放新生的对象。

一般占据堆的1/3空间。
由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。

新生代又分为 Eden区、ServivorFrom、ServivorTo三个区。

  • den区:Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。
  • ServivorTo:保留了一次MinorGC过程中的幸存者。
  • ServivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者 。

MinorGC的过程:MinorGC采用复制算法。首先,把Eden和ServivorFrom区域中存活的对象复制到ServicorTo区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果ServicorTo不够位置了就放到老年区);然后,清空Eden和ServicorFrom中的对象;最后,ServicorTo和ServicorFrom互换,原ServicorTo成为下一次GC时的ServicorFrom区。

二:老年代:主要存放应用程序中生命周期长的内存对象。

老年代的对象比较稳定,所以MajorGC不会频繁执行。在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。

MajorGC采用标记—清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。//加入Java开发交流君样:756584822一起吹水聊天
MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

三:永久代

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域. 它和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。//加入Java开发交流君样:756584822一起吹水聊天

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


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

1、为了解决永久代的OOM问题,元数据和class对象存在永久代中,容易出现性能问题和内存溢出。

2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出(因为堆空间有限,此消彼长)。

3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

4、Oracle 可能会将HotSpot 与 JRockit 合二为一。

image

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:756584822

相关文章

  • JVM的新生代、老年代、MinorGC、MajorGC

    JVM中的堆,一般分为三大部分:新生代、老年代、永久代: 一:新生代:主要是用来存放新生的对象。一般占据堆的1/3...

  • JVM的新生代、老年代、MinorGC、MajorGC

    JVM中的堆,一般分为三大部分:新生代、老年代、永久代: 一:新生代:主要是用来存放新生的对象。 一般占据堆的1/...

  • GC

    MinorGC/MajorGC/FullGC 新生代的伊甸园区满的时候使用Minor GC(YGC),s0/s1满...

  • JVM-垃圾回收GC(1)

    GC(Garbage Collector)概念 MinorGC/YGC:年轻代空间耗尽 MajorGC/FGC:在...

  • minorGC和FullGC

    什么是minorGC和FullGC minorGC是发生在新生代的GC,而FullGC是发生在老年代的GC。至于为...

  • MinorGC、MajorGC、FullGC的区别

    参考:https://www.cnblogs.com/leeego-123/p/11298267.html

  • 七、MinorGC、MajorGC、FullGC差异

    GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。与C++不同的是,Jav...

  • JVM 什么情况下触发fullGC、minorGC

    10.JVM 什么情况下触发fullGC、minorGC minorGC:eden区空间不足fullGC:1.调用...

  • GC

    什么时候GC 首先说明GC是有两种的:MinorGC和FullGC。MinorGC发生在新生代,FullGC发生在...

  • java:JVM总结

    JVM知识总结 新生代,老年代是啥? 是堆。新建的对象在新生代,对象活了很多次gc后,会进入老年代。 新生代为何有...

网友评论

      本文标题:JVM的新生代、老年代、MinorGC、MajorGC

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