您的位置:首页 > 其它

深入理解JVM虚拟机学习笔记(三)内存分配和回收策略

2017-02-05 19:44 696 查看
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多具有朝生夕灭的特性,所以Minor GC 非常频繁,一般回收速度也比较快。

老年代GC(Full GC/Major GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC。非绝对。

大对象直接进入老年代

所谓大对象是指需要大量连续内存空间的Java对象。最典型的大对象就是那种很长的字符串和数组。

虚拟机提供了一个-XX:PretenureSizeThreshold参数,另大于这个设置值的对象直接在老年代中分配,这样做的目的是避免在Eden区和两个Survivor区之间出现大量的内存拷贝。

长期存活的对象将进入老年代

虚拟机采用分代收集的思想来管理内存,那么内存回收时就必须识别哪些对象应当放在新生代,哪些对象应当放在老年代,为了这一点,虚拟机给每个对象定义了一个对象年龄计数器,如果对象在Eden区出生,并经历第一次Minor GC后仍然存活,并且能被Survivor容纳的话,就被移动到Survivor区,并将对象年龄设为1,对象在Survivor区中每次Minor GC都没有被回收掉,那么年龄加1,当年龄增加到一定程度,默认是15岁,则被晋升到老年代中。对于年龄阈值可以通过参数-XX:MaxTenuringThreshold来设置。

动态对象年龄判定

上述并不一定总是要求。如果在Survivor中相同年龄对象所占空间总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象直接进入老年代。无需等到XX:MaxTenuringThreshold设置的年龄。

空间分配担保

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息