JVM中的堆结构,它是如何管理对象的

堆当中主要是存放对象的,而里面的对象是通过动态链接找到相应的class文件,首先先来说一说堆的结构。

如图所示

堆首先从大类进行分类,分为:年轻代、老年代。

年轻代和老年代的关系:如上图所示,年轻代分为三个部分,一个是Eden,剩下的是Survivor区,可以互相分配对象,我为了区分Survivor认定它名字为From和To区。内存分配上来说,假如总共的堆有600M的空间,JVM默认的年轻代占200M,老年代占400M,而年轻代中的Eden占200M的8/10(160M),From和To分别各占1/10(20M),加起来40M。

Eden从意思上来看就是伊甸园,亚当和夏娃造小人的地方嘛,所以都是存放新对象的。当对象放满了之后呢它会进行一次minor gc操作,也就是JVM中的垃圾回收(具体实现要学习JVM的垃圾回收机制),最后一直没有被回收的对象被放到From或者To中去,当From中的对象满了以后又执行一次minor gc操作,将对象放到To当中,相反,To中的对象满了也一样放到From中。对象当中有一个属性,我们称为分代年龄,From和To他们两个之间没有主从关系,对象在被minor gc时如果一直没被回收,就代表了它会在两个区域重复转存,每次转存时,分代年龄会+1,当分代年龄到了15的时候,对象会被放到老年代中,当老年代满了以后,会执行一次minor gc回收没用的对象,但是当老年代满了且所有的对象都是活着的时候,JVM就会执行一次full gc,当然上面这些回收机制只是一种,还有很多其他的,需要根据需要来选择。

full gc是最耗性能的,我们举一个例子,当程序启动的时候在年轻代有多次full gc的话,程序启动就会变慢,此时我们就应该更改Eden的默认大小,让full gc的次数变少。以达到调优的目的。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值