美文网首页JVM
JVM堆分代

JVM堆分代

作者: 吴老板 | 来源:发表于2020-08-25 14:02 被阅读0次

为什么要分代

堆内存是虚拟机管理的内存中最大的一块,也是垃圾回收最频繁的一块区域,我们程序所有的对象实例都存放在堆内存中。给堆内存分代是为了提高对象内存分配和垃圾回收的效率。试想一下,如果堆内存中没有区域划分,所有的新创建的对象和生命周期很长的对象放在一起,随着程序的运行,对内存需要频繁进行垃圾收集,而每次回收都要遍历所有的对象,遍历这些对象所花费的时间代价是巨大的,会严重影响GC效率。

堆内存分代策略

java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代、老年代和永久代(对HopSpot虚拟机而言),这就是JVM的内存分代策略。有了内存分代,情况就不同了,新创建的对象会在新生代中分配内存,经过多次回收仍然存活下来的对象放在老年代中,静态属性、类信息等存放在永久代中,新生代中的对象存活时间短,只需要在新生代区域中频繁进行GC,老年代中对象生命周长,内存回收的频率相对较低,不需要频繁进行回收,永久代中回收效果太差,一般不进行垃圾回收,还可以根据不同年代的特点采用合适的垃圾收集算法。分代收集大大提升了收集效率,这些都是内存分代带来的好处

内存分代详情

java虚拟机将堆内存划分为新生代、老年代和永久代,永久代是HotSpot虚拟机特有的概念,它采用永久带的方式来实现方法区,其他的虚拟机实现没有这一概念,而且HotSpot也没有取消永久代的趋势,在JDK1.7中HopStop已经开始“去永久化”,把原本放在永久代中的字符串常量池移出。永久代主要存放常量、类信息、静态变量等数据,与垃圾回收关系不大,新生代和老年代是垃圾回收的主要区域

image.png
新生代 (Young Generation)

新生成的对象优先存放在新生代中,新生代对象朝生夕死,存活率很低,在新生代中常规应用进行一次垃圾收集一般可以回收70%~95%的空间,回收效率很高。

HotSpot将新生代分为三块,一块较大的Eden空间和两块小的 Survivor空间,默认比例为8:1:1。划分的目的是因为 HotSpot采用复制算法来回收新生代,设置这个比例是为了充分利用内存空间,减少浪费。新生成的对象在Eden区分配(大对象除外,大对象直接进入老年代),当Eden区没有足够的空间进行分配时,虚拟机将发起一次 Minor GC。

GC开始时,对象只会存在于Eden区和 From Survivor区, To Survivor区是空的(作为保留区域)。GC进行时,Eden区中所有存活的对象都会被复制到 To Survivor区,而在FromSurvivor区中,仍存活的对象会根据它们的年龄值决定去向,年龄值达到年龄阀值(默认为15,新生代中的对象毎熬过一轮垃圾回收,年龄值就加1,GC分代年龄存储在对象的 header中)的对象会被移到老年代中,没有达到阀值的对象会被复制到 To Survivor区。接着清空Eden区和 From Survivor区,新生代中存活的对象都在 To Survivor区。接着,From Survivor区和 To Survivor区会交换它们的角色,也就是新的 To Survivor区就是上次GC清空的From Survivor区,新的 From Survivor区就是上次GC的 To Survivor区,总之,不管怎样都会保证 To Survivor区在一轮GC后是空的。GC时当 To Survivor区没有足够的空间存放上一次新生代收集下来的存活对象时,需要依赖老年代进行分配担保,将这些对象存放在老年代中。

老年代

在新生代中经历了多次(具体看虚拟机配置的值)GC后仍然存活下来的对象会进入老年代中。老年代中的对象生命周期较长,存活率比较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢

永久代

永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,对这一区域而言,Java虚拟机规范指出可以不进行垃圾收集,一般而言不会进行垃圾回收。

相关文章

  • JVM堆分代

    为什么要分代 堆内存是虚拟机管理的内存中最大的一块,也是垃圾回收最频繁的一块区域,我们程序所有的对象实例都存放在堆...

  • 你的“对象”啥时候会进入老年代?

    JVM堆中有新生代、老年代两块区域,因为使用分代回收策略新生代还会划分为Eden和两个Survivor区,JVM堆...

  • jvm垃圾回收策略

    一、jvm堆内存的分代划分在基于分代的内存回收策略中,堆空间通常都被划分为3个代,年轻代,年老代(或者tenure...

  • [转载] JVM堆模型/分代

    JVM堆(Heap)= 新生代(Young) + 旧生代(Tenured)新生代(Young)= Eden区 + ...

  • <深入Java虚拟机>之1.4:内存分配机制

    一、简介 JVM采用分代垃圾回收。JVM把堆空间分为年老代和年轻代。98%的对象创建了没多久就会消亡,存储在年...

  • JVM堆分代笔记

    JVM内存分代策略 JVM 根据对象的存活周期不同,把堆内存划分为三块,一般为新生代、老年代、永久代(对于HotS...

  • Java垃圾回收机制

    Java的内存分布 在JVM中,内存是按照分代进行组织的。 其中,堆内存分为年轻代和年老代,非堆内存主要是Perm...

  • JVM 垃圾回收机制之堆的分代回收

    JVM垃圾回收机制之堆的分代回收 前言 前文我们了解了Java的GC机制,对于堆中的对象,JVM采用引用计数和可达...

  • 【干货】java面试核心知识点精讲---jvm运行内存

    JVM的运行时内存 JVM的运行时内存也叫作JVM堆,从GC的角度可以将JVM堆分为新生代、老年代和永久代。其中新...

  • jvm参数

    JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分...

网友评论

    本文标题:JVM堆分代

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