运行时数据区(6)——堆内存细分详解

年轻代和老年代

(1)存储在JVM中的Java对象可以分为两大类:
第一类是生命周期较短的顺势对象,其创建和消亡都非常迅速;第二类是生命周期较长,甚至可以与JVM生命周期保持一致的对象。
(2)JVM堆区内存进一步细分:年轻代、老年代
年轻代又可以分为:伊甸园区(Eden区)、幸存者0区(Survivor0、s0)、幸存者1区(Survivor1、s1)。s0和s1中有一个是from,另一个是to。to内存中没有存放对象
(3)s0和s1区内存大小相同(如果开启了自适应模式,则可能会不同)

JVM堆区各部分占比
(4)默认情况下,新生代与老年代的比例为1:2,Eden:s0:s1=8:1:1,这两个比值可以修改.
(5)几乎所有的Java对象都在Eden区new出来,个别太大的对象直接存入老年区
(6)Java中绝大多数对象的销毁都是在新生代进行的

Java对象分配的过程

(1)new的对象先放在Eden空间。此区域大小有限。
(2)当Eden空间满时,而程序又要创建对象,此时Minor GC启动,对整个新生代进行垃圾回收,将无用的对象销毁,再加载新的对象放到Eden区。
(3)然后将Eden中未被销毁的对象转移到s0区,转移完毕后Eden区为空。
(4)如果再次出发Minor GC,此时上次幸存下来的被转移到s0区的对象,如果没有被回收,就会放到s1区。
(5)如果再次经历Minor GC,此时会重新放回s0区,接着再放回s1区。
(6)默认15次,对象可以进入老年代。对象每熬过一次Minor GC,年龄将加一,默认情况下对象年龄15为阈值,当年龄大于15岁时将被送入老年代。
(7)在老年代相对悠闲,当老年代内存不足时,会触发Major GC进行养老区内存清理。
(8)若养老区进行了Major GC后依然无法进行对象的保存,就会产生OOM。
图解:
对象创建的过程
①每次执行完GC后,谁空谁就是to区。一GC一交换,谁空谁为to
②只有Eden区满后才会出发Minor GC,幸存者区满后不会触发Minor GC,只有Eden触发Minor GC后幸存者去连同Eden区一同被回收。
③幸存者区对象年龄未达到阈值也有可能被送入养老区。
④执行完Minor GC后,Eden区和from都变为空,to区不为空。此时from和to交换(即GC前的from现在变成to,GC前的to现在变成from)
(9)垃圾回收频繁在新生区收集,很少在老年区收集,几乎不在永久区/元空间收集

对象分配的特殊情形

对象分配特殊情形

Minor GC、Major GC和Full GC

(1)JVM在执行GC时,并非每次都对这三个区域(新生区、老年区、永久区/元空间)一起回收,大部分回收都指新生代的回收。
(2)在Hotspot虚拟机中,GC按照回收区域分为两种类型:第一种是部分收集,另一种是整堆收集。
(3)部分收集:不是完整收集整个Java堆的垃圾收集,其又分为:
新生代收集:Minor GC 只在新生区工作(包括Eden、s0和s1)
老年代收集:Major GC 只在老年区工作
注:Major GC和Full GC会混用,需要具体区分是老年代回收还是整堆回收
混合收集:Minxed GC
(4)整堆收集:
Full GC 收集整个Java堆和方法区的垃圾
(5)年轻代GC(Minor GC)触发机制
①当年轻代空间不足时就会触发Minor GC,这里的年轻代指的是Eden区满。Survivor区满不会触发Minor GC(每次Minor GC会清理整个年轻代的内存)
②由于太多Java对象都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也很快
③Minor GC会引发STW(STW是指停止用户线程的执行,等垃圾回收执行结束后再恢复用户线程)
(6)老年代GC(Major GC)触发机制
出现了Major GC经常会伴随至少一次Minor GC,也就是再Old空间不足时,会先触发Minor GC,如果之后空间还不足,则触发Major GC。Major GC比Minor GC慢10倍以上
(7)Full GC触发机制
触发Full GC有以下五种情况:
①System.gc();系统建议启动垃圾回收器,但不一定会启动
②老年代空间不足
③方法区空间不足
④通过Major GC后进入老年代的平均大小大于老年代的可用内存
⑤由Eden区向s1区复制时,对象大小大于to空间可用内存时,则把该对象转存到老年代,且老年代可用内存大小小于该对象大小。

堆空间分代思想

不分代其实也完全可以,分代的唯一理由是优化GC性能

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值