JVM-内存分配与回收策略
2016-03-23 20:17
295 查看
简单介绍一下Java技术体系下的Java虚拟机内存分配与回收策略.
新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多数都具备朝生夕灭的特征,所以Minor GC 非常频繁,一般回收速度也比较快.
老年代GC(Major GC / Full GC):指发生在老年代的GC出现了Major GC,经常会伴随至少一次的Minor GC(但并不是绝对的,在Parallel Scavenge收集器策略里就直接进行Major GC的策略选择过程).Major GC 的速度一般比Minor GC慢10倍以上.
2.大对象直接进入老年
大对象是指需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组.
虚拟机提供了一个 -XX:PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配.这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制.
3.长期存活对象将进入老年代
虚拟机给每个对象定义类一个对象年龄计数器.如果对象在Eden出生并经过第一次Minor Gc后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设置为1.对象在Survivor区中每经过一次Minor GC,年龄增加1岁,当他的年龄增加到一定程度(默认值为15),就会别晋升到老年代中.对象晋升老年代的年龄阀值,可以通过参数 -XX:MaxTenuringThreshold设置.
1.对象优先在Eden分配
大多数情况下,对象在新生代Eden区中分分配.当Eden区已没有足够空间进行分配时,虚拟机将发起一次 Minor GC.新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多数都具备朝生夕灭的特征,所以Minor GC 非常频繁,一般回收速度也比较快.
老年代GC(Major GC / Full GC):指发生在老年代的GC出现了Major GC,经常会伴随至少一次的Minor GC(但并不是绝对的,在Parallel Scavenge收集器策略里就直接进行Major GC的策略选择过程).Major GC 的速度一般比Minor GC慢10倍以上.
2.大对象直接进入老年
大对象是指需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组.
虚拟机提供了一个 -XX:PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配.这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制.
3.长期存活对象将进入老年代
虚拟机给每个对象定义类一个对象年龄计数器.如果对象在Eden出生并经过第一次Minor Gc后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设置为1.对象在Survivor区中每经过一次Minor GC,年龄增加1岁,当他的年龄增加到一定程度(默认值为15),就会别晋升到老年代中.对象晋升老年代的年龄阀值,可以通过参数 -XX:MaxTenuringThreshold设置.