jvm6 jvm的内存分配和回收策略

1.作用

第一个作用:给对象分配内存
第二个作用:回收分配给对象的内存

2.怎么给对象分配内存

第一个问题:在哪里给对象分配内存:

主要是在java堆上分配

第二个问题:怎么在java堆上给对象分配内存

java堆主要分为两个部分:新生代和老年代,新生代又分为Eden区,From Survivor区,To Survivor区
分配的原则是:
1.对象优先在Eden分配(当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC);
2.大对象(需要大量连续内存空间的java对象,虚拟机有一个参数-XX:PretenureSizeThreshold,超过这个尺寸就是大对象)直接进入老年代;
目的:因为大对象需要较大的连续内存,避免Eden和两个Survivor区发生大量的内存复制
3.长期存活的对象将进入老年代(一般指超过-XX:MaxTenuringThreshold这个值就进入老年代),虚拟机为每一个对象定义了一个年龄计数器,如果对象经过了一次Minor GC,那么对象就会进入Survivor区,之后每经过一次Minor GC,对象的年龄就加1,直到达到阈值;
4.动态对象年龄判断:并不是必须要求对象的年龄超过MaxTenuringThreshold才能进入老年代;
如果在Survivor空间中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象就可以直接进入老年代。
5.空间分配担保

第三个问题:空间分配担保

发生Mnior GC之前,虚拟机首先检查老年代最大的可用连续空间是否大于新生代所有对象总空间,如果是,Minor GC是安全的的;
如果不是,虚拟机会查看HandlePromotionFailure设置值是否允许担保失败,如果允许,检查老年代最大的可用连续空间是否大于历次晋升到老年代对象的平均大小,如果是,就执行Minor GC(也是有风险的);如果不是,进行Full GC.

3.怎么回收内存空间

minor GC:新生代的垃圾回收动作(运用复制算法);发生的很频繁;执行时间比较快;
Full GC:老年代的垃圾回收动作(标记清除算法或者标记整理算法):速度比较慢;

4.Full GC和Minor GC?

Minor GC:新对象生成,但是在Eden空间申请失败时,会触发Minor GC,对Eden区和Survivor区进行GC,清除掉非存活的对象,并且把存活的的对象移动到Survivor的一个区中;
只会在年轻代中进行。
Full GC:对整个堆进行清理(年轻代和老年代)。

5.Full GC和Minor GC什么时候发生?

Minor GC:

如果Eden空间占满了,会触发Minor GC;
仍然存活的对象将被复制到Survivor1中去,Eden空间是清空的,可以分配给新的对象;
又触发了一次Minor GC,survivor1和Eden中存活的对象呗复制到Surviovr2中,并且survivor1和Eden被清空;
在同一时刻,只有Eden和一个survivor被操作。

Full GC

如果一个对象不能在Eden被创建,他会直接创建在老年代中;
如果老年代的空间被沾满会触发老年代的 Full GC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值