美文网首页
【笔记】深入理解 java 虚拟机---内存回收

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

作者: 张航_8ee7 | 来源:发表于2018-01-02 14:28 被阅读0次

    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

    开了好。

    相关文章

      网友评论

          本文标题:【笔记】深入理解 java 虚拟机---内存回收

          本文链接:https://www.haomeiwen.com/subject/ybnfnxtx.html