Java虚拟机番外篇:堆

一、堆的概述

1、堆的图解(此图摘抄自鲁班学院)

 

2、概述:在JVM启动时创建,唯一目的就是存放对象实例,几乎所有的对象都在堆区创建。线程共享内存区。

3、分类:新生代(Eden:From Survivor:To Survivor, 默认比例8:1:1)和老年代,默认比例是(1:2)。

4、最值:最小为物理内存的1/64,最大为物理内存1/4。

5、进入老年代的条件

(1)15次gc依然存活的对象:由于分代字段为4个字节,所以最大为15,不能调节成20;

(2)大对象:对象大小占Eden区的一半。Eden区的大小在运行时期动态调整的。

(3)空间分配担保:在发生新生代垃圾回收前(Minor GC),虚拟机会判断老年代最大可用内存是否大于新生代所有对象之和。如果此条件成立则分配,否则检查HandlePromotionFailure设置值是否允许担保失败。如果允许,则会继续检查老年代最大可用空间是否大于历次晋升到老年代对象的平均大小,如果大于,则进行一次Minor GC;如果小于或者HandlePromotionFailure不允许冒险,则这时需要进行一次Full GC。如果某次Minor GC对象突增,远远超过了历次平均值的话,导致了HandlePromotionFailure失败,那么JVM只好在失败后重新发起一次Full GC。尽管HandlePromotionFailure绕了很大一个圈子,但是大部分情况下是将此开关打开的,这样可以避免频繁的Full GC。

(4)动态年龄判断:针对Eden区和from区。虚拟机并不是永远的要求对象的年龄必须达到MaxTenuringThreshold才能进入老年代的,如果在Survivor空间中相同年龄所有对象的总和大于Survivor空间(From区或To区)的一半,年龄大于或等于该年龄的的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

二、堆的故事

上述堆的概念以及各种值的记忆确实是比较难以理解了。但如果把堆比喻成小说世界中的一部分,却变得十分有趣了。我们把堆比喻成一个修仙的世界,把对象比喻成人,把运行程序或者说创建对象的人比喻成创世之神。这样看来,这个修仙的世界总共分为了两个部分:一个是凡人界(新生区)、一个是修真界(老年代)。凡人界的人可以通过修仙的方式(GC后依旧能存活的方式)进入修真界以获得更长的寿命。

自创世之神创造这个世界以来,人类世界(新生代)总共被分成了三大部分:伊甸大陆(Eden区)、蓬莱岛(From区)、浮屠岛(To区)。其中,伊甸大陆是人类降生以及存活的基本大陆,占整个人类世界的十分之八,而蓬莱大陆和浮屠各占十分之一。凡人界的人们有着各自的使命,他们以修仙的方式获取更长的寿命,一般来说,要经过15次天劫(15次Young GC)并且能存活下来,方能进入修仙界。由于人类的寿命十分短暂,伊甸大陆的绝大多数人,大多过着“朝生夕死”的生活。一些人不安天命,加入仙门(被其他对象引用而存活的对象),以修仙的方式逆天改命。在经历过第一次天劫后,极少数人成功进入了蓬莱岛(From区)。在第二次天劫降落时,成功经历天劫的人又进入了浮屠岛(To区)进行修炼。来来回回总共经历了15次天劫,有的人陨落了(GC时被垃圾回收器回收),有的人则成功进入了修真界(老年代)。由于修仙的人日益增多,进入修真界的人也越来越多,等到占用的区域过多导致修真界不够用(老年代内存不足),修真界中所有的人将同时经历一次大天劫(Full GC)。此次大天劫存活的人将继续留在修真界,未能存活的人则陨落了。创世之神心怀悲悯,尽可能的避免大天劫的频繁降临(避免频繁Full GC)。

当然,修仙方式不止一种,也有些是创世之神的开放的特例。预知详情,请听下回分解。

三、堆的总结

堆中的情况大致是这个样子。通过故事的形式,也许大家会更容易理解堆中发送的事情。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值