GC新生代对象晋升到老年代情况总结

对象优先在Eden分配,且新生代对象晋升到老年代有多种情况,

现在做一个总结:

(1)、Eden区满时,进行Minor GC,当Eden和一个Survivor区中依然存活的对象无法放入到Survivor中,则通过分配担保机制提前转移到老年代中。

(2)、若对象体积太大, 新生代无法容纳这个对象,-XX:PretenureSizeThreshold即对象的大小大于此值, 就会绕过新生代, 直接在老年代分配, 此参数只对Serial及ParNew两款收集器有效。

(3)、长期存活的对象将进入老年代。

虚拟机对每个对象定义了一个对象年龄(Age)计数器。当年龄增加到一定的临界值时,就会晋升到老年代中,该临界值由参数:-XX:MaxTenuringThreshold来设置。

如果对象在Eden出生并在第一次发生MinorGC时仍然存活,并且能够被Survivor中所容纳的话,则该对象会被移动到Survivor中,并且设Age=1;以后每经历一次Minor GC,该对象还存活的话Age=Age+1。

(4)、动态对象年龄判定。

虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。

原文地址:https://www.cnblogs.com/yuandluck/p/9484495.html

时间: 2024-10-29 11:15:03

GC新生代对象晋升到老年代情况总结的相关文章

对象如何进入老年代的问题

现代虚拟机一般使用的内存回收策略是分代收集,即把对象分为两代,新生代使用复制算法回收内存,老年代使用标志-整理算方法回收内存.但是有时候新生代对象存活率较高,导致有大对象分配时内存不足,虚拟机也会采用担保机制是大对象进入老年代. 什么时候发生内存回收 大多数情况下,对象在新生代Eden区分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC.同理,当老年代没有足够的空间时也会发起一次Full GC/Major GC 内存担保机制 现代虚拟机把新生代分为三个区域,一个Eden

java中什么样的对象能够进入老年代

1.大对象:所谓的大对象是指需要大量连续内存空间的java对象,最典型的大对象就是那种很长的字符串以及数组,大对象对虚拟机的内存分配就是坏消息,尤其是一些朝生夕灭的短命大对象,写程序时应避免. 2.长期存活的对象:虚拟机给每个对象定义了一个对象年龄(Age)计数器,如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1,.对象在Survivor区中每熬过一次Minor GC,年龄就增加1,当他的年龄增加

JVM 晋升到老年代的动态年龄判断

虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄. 这个表述应该是老的虚拟机的动态年龄判断算法,其实推演一下是存在缺陷的的,请看下图: 如果此时又有15%的对象要进入Survivor区,此时存活的对象超过Survivor的大小,要全部进入老年代,其实这样不

GC 老年代 新生代

参考资料: http://blog.csdn.net/flamezyg/article/details/44673951 http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html http://www.360doc.com/content/12/1023/16/9615799_243296263.shtml   JVM中的堆,一般分为三大部分:新生代.老年代.永久代: 一:新生代:主要是用来存放新生的对象.一般占据堆的1/3空间

【转】Java中的新生代、老年代、永久代和各种GC

JVM中的堆,一般分为三大部分:新生代.老年代.永久代: 1 新生代 主要是用来存放新生的对象.一般占据堆的1/3空间.由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收. 新生代又分为 Eden区.ServivorFrom.ServivorTo三个区. Eden区:Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代).当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收. ServivorTo:保留了一次MinorGC过程中的幸存者.

Java GC、新生代、老年代

堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Young ) 又被划分为三个区域:Eden.From Survivor.To Survivor.这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收.堆的内存模型大致为: 从图中可以看出: 堆大小 = 新生代 + 老年代.其中,堆的大小可以通过参数 –Xms.-X

新生代和老年代垃圾回收的细节

新生代和老年代 对象在被实例化之后,都是属于新生代. 大部分新生代的生命周期都是及其短暂的,例如在一个方法中创建的对象会随着方法执行完毕,栈空间的栈帧出栈后而失去引用. 而有一些对象确实会长期存活在堆内存的,比如被Static引用的对象.这种对象不会轻易的被垃圾回收器回收. 所以JVM会将堆内存分为两个区域,一个年轻代,一个老年代. 其中年轻代,顾名思义,就是创建和使用完之后立马就要被回收的对象放在里面.然后老年带呢,就是把一些会长期存活的对象放在里面. 为什么要分成新生代和老年代 很多人都会有

堆中的新生代与老年代

1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描.而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存"朝生夕死"对象的区域进行回收,这样就会腾出很大的空间出来. 2.年轻代中的GC     HotSpot JVM把年轻代分为了三部分:1

JVM 新生代老年代

1. Java堆中各代分布:                            图1:Java堆中各代分布 Young:主要是用来存放新生的对象. Old:主要存放应用程序中生命周期长的内存对象. Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所