天天看点

【笔记】深入理解 java 虚拟机---内存回收

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       

开了好。