JVM-内存分配

Java体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存

heap(堆)区:Eden space(伊甸区)、survivor space(幸存者区)、old age(老年代)

大多数情况下,对象在新生代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倍以上。

Minor GC触发条件:当Eden区满时,触发Minor GC。

Full GC触发条件:

(1)调用System.gc时,系统建议执行Full GC,但是不必然执行

(2)老年代空间不足

(3)方法区空间不足

(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存

(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小


大对象直接进入老年代。(比如:很长的字符串以及数组)

长期存活的对象将进入老年代。(虚拟机给每个对象定义一个对象年龄计数器(age),如果对象在Eden区出生并经过第一次Minor GC后仍然存活,并且能被Servivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1。对象在Survivor区中每熬过一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认是15岁),就将会被晋升到老年代中。还有一种动态对象年龄判定:如果Survivor空间中相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。)


猜你喜欢

转载自blog.csdn.net/dear_mango/article/details/80713882