一。概述:
二、堆内存细分:
从逻辑上jvm堆上包含方法区,但实际上 只包含 新生代和老年代
例子:
从上面的例子可知:Eden+S0+S1+Old Gen = 10M
jdk1.8和jdk1.8之前方法区的对比:
验证:
a.设置堆空间大小的参数:
-Xms 用来设置堆空间(年轻代+老年代)的初始内存大小
-X 是jvm的运行参数
ms 是memory start
-Xmx 是用来设置堆空间(年轻代+老年代)的最大内存大小。
b.默认堆空间的大小:
初始内存大小:物理电脑内存的 64分之1
最大内存大小:物理电脑内存大小的 4分之1
c.开发中建议将-Xms 和Xmx 设置成一样的值:因为避免频繁的扩展和降低内存对系统造成不必要的压力。
这里将-Xms 和-Xmx 设置成600m 为什么显示的是575m:
因为只包含一个survivor 区。
d.查看设置的参数:
方式一:jps 查看到进程号,然后根据 jstat -gc 进程号
方式二:-XX+PrintGCdetails。
四、年轻代和老年代细分及设置大小:
根据 -XX:NewRatio=2 (一般不会调动)设置新生代和老年代的比例。
可以根据jinfo -flag NewRatio 进程号 查看。
根据 -XX:SurvivorRatio=8 (默认)设置Eden 和S0 和 S1 的比例。
根据jvisualvm查看Eden和S0 和S1的比例是 6:1:1
原因是 自适应(-XX:+UserAdaptiveSizePolicy(默认有这个参数,去掉就好了))
-Xmn 设置新生代大小。(一般设置用NewRatio 设置比例)
五、图解对象分配过程:
a、概述:
b、图解:
注:红色的是垃圾,绿色的不是垃圾。
S0 中绿色对象的 “1” 是年龄计数器。
谁空谁是to。
Eden区满的时候触发YGC S0和S1区满的时候不会触发YGC。
设置晋升老年代的阈值: -XX:MaxTenuringThreshold=15(默认是15)晋升到老年代。
c、总结:
六、对象分配过程特殊情况:
七:内存分配策略:
验证大对象直接进入老年代:
说明一下空间分配担保:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)