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

来源:互联网 发布:如何做erp软件 编辑:程序博客网 时间:2024/06/17 03:20

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 
开了好。

 










阅读全文
0 0
原创粉丝点击