1 对象优先在eden 上分配。
配置参数: jvm初始分配的内存最大内存(-Xmx20m ) 最小堆内存(-Xms20M )
年轻带内存 (-Xmn10M ) Eden 和 Suriv 的关系8:1:1(-XX:SuriviorRatio =8)
新生代 GC 。比较频繁。作用于新生代。 Mionor GC
老年代GC。 发生在老年代。发生一次Major GC,伴随着一次 Mionor GC。
2 大对象直接进入老年代。
-XX:PretenureSizeThreshold 参数。
设置该参数的值,如果对象的内存大于该值,直接在老年代分配。
该参数只适用于 Serial 和 PraNew 。 不支持 Prallel Scavenge. 但是我用 ps 收集器测下来,是可以直接进入老年代的。
3 长期存活对象将进入老年代。
当对象 经历一次GC后,如果没有被回收,并且在 Survivor能够存下。则 它的age计数器+1。 可以通过 -XX:MaxTenuringThreshold 设置。
不设置 默认 15。 及对象的年龄计数器达到15后进入老年代。
4 对象的动态进入 老年代。
当 surivior 里的 内存,存在同一个年龄内存之和 是其surivior 内存大小的一半时
所有大于和等于这个年龄的对象都会被 存放到 老年代。
这个时候将不会在去查看 -XX:MaxTenuringThreshold
这个参数。
5 内存担保。
HandlePromotionFailure
这个参数 ,决定虚拟机是否要担保
担保 是来干什么的??
我们知道 新生代内存有复制算法。 就是使用 eded 和 2 块 survivor 区域。 其中有一块 survivor 区域是不存放分配对象的。 只有当进行Minor GC, 这个区域会把所有存货的对象放到其上面,进行年龄叠加。 所以,会存在,Survivor 内存小于存货对象的内存。这时候,内存将直接在老年代分配。
如果 不开担保?
每次 survivor 区内存不够都会进行 GC.。
如果开担保?
内存不够就去老年代拿,所以可以省掉一部分不是很必要的GC。 所以,这个参数,还是
HandlePromotionFailure
开了好。
网友评论