8.堆
-Xmx:最大堆大小
-Xms:初始堆大小
-Xmn:年轻代大小
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值
所有线程共享堆,但也可以划分线程私有的缓冲区。(TLAB)
JDK7 : 新生代 老年代 永久代
JDK8 : 新生代 老年代 元空间
默认堆空间大小
- 初始内存大小:物理电脑内存大小/64
- 最大内存大小:物理电脑内存大小/4
主动设置大小:Run -> Edit C…
开发中建议将初始内存大小和最大内存大小设置为一样的值。
查看设置的参数:
- jps / jstat -gc 进程id
- -xx:+PrintGCDetails
- 年轻代(YoungGen):Eden空间、survivor0(from区)、survivor1(to区)
- 老年代(OldGen)
默认占比:
YoungGen 1/3 OldGen 2/3
Eden 8/10 from 1/10 to 1/10
-XX:NewRatio : 设置新生代与老年代的比例,默认2.
-XX:SurvivorRatio : 设置新生代中Eden区与Survivor的比例,默认8
-XX:-UseAdaptiveSizePolicy : 关闭自适应的内存分配策略
-Xmn :设置新生代最大内存大小
-XX:+PrintGCDetails : 打印GC详情
几乎所有的java对象都是在Eden区被new 出来的
绝大部分的java对象的销毁都在新生代进行。
总结:
- 针对survivor0 1 :复制之后有交换,谁空谁是to;
- 关于垃圾回收:频繁在新生区收集,很少在老年区收集,几乎不在永久区/元空间收集
所以说,堆空间并不都是共享的。
空间分配担保
逃逸分析
如何快速判断是否发生了逃逸,看new的对象实体是否有可能在方法外被调用