您的位置:首页 > 编程语言 > Java开发

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

2017-12-22 22:10 369 查看
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
开了好。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐