JVM-堆

2 篇文章 0 订阅

堆:java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。

  1. 新生代:
    • . eden区
    • . S区
      1. s0区
      2. s1区
  2. 老年代
    在这里插入图片描述

jdk1.8为什么要把永久代干掉,取而代之的是元空间呢
1.永久代:空间大小是固定的
2.元空间:自动扩容,扩容堆外内存

新生代

对象创建发生在什么区?

  • 一般情况都会创建在eden区,一些大对象分配到老年代

可以通过参数配置 -XX:PretenureSizeThreshold=6M ,例如超过6M的对象直接进入到老年代
在这里插入图片描述

  1. 对象创建在eden区,但是eden空间到了阈值,需要发生Minor GC,
  2. 将存活的对象复制到s0区,存活的对象GC年龄加1,清空eden区中的对象
    在这里插入图片描述
    在这里插入图片描述
  3. 当eden的空间再次到达阈值时,将会再次发生GC,将存活的对象和s0区中的对象一起复制到s1区
    在这里插入图片描述

总结
eden区到达空间阈值,就会发生一次Minor GC,将存活的对象复制到s区,可能是s0,也可能是s1,GC过的存活对象GC年龄会加1,从而记录对象进行几次垃圾回收

s区

S 区分为两块 S0 和 S1 。
在同一个时间点上,S0和S1只能有一个S区有数据,另外一块是空的。

接着上面的GC来说,Eden区发生了GC ,把存活的对象假设复制到了S0区,此时 S1 是空的 。
假设一直发生对象创建 又让Eden区到了一个阈值,那么此时会进行一次Minor GC, 此时S0区中对象的年龄就会+1,Eden区中所有存活的对象会被复制到S1,此时S0中还能存活的对象会有两个去处,若对象年龄达到老年代的年龄阈值,此时S0对象会被移动到Old区,如果S0区没有达到阈值的对象会随着Eden一起被复制到S1区。

可以通过参数设置对象年龄到老年代年龄的阈值:
-XX:MaxTenuringThreshold=15

当Minor GC回收时,会将Eden区和上一次S区还存活的对象一次性复制到另外一个S区里面,这样保证了90%的对象都会被回收,新生代中的对象都是“朝生夕死”的对象,尽量减少进入老年代区的几率,因为老年代GC要比MinorGC慢十倍,如果S区的内存不够用了就出触发分配担保会存入老年代

老年代

老年代:我们也称为是 Old区
从上面的分析可以看出,一般Old区都是年龄比较大的对象,或者是一些大>内存对象。

参数设置:-XX:PretenureSizeThreshold=6M

在Old区也会有GC的操作,Old区的GC我们称作为Major GC

GC 总结

新生代:Minor Gc /Young GC
老年代:Major GC
Full GC【JVM堆回收】 = Minor Gc + Major GC
注意:如果程序经常发生Full GC ,那么需要去优化代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值