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对象的销毁都在新生代进行。

8.堆

总结:

  • 针对survivor0 1 :复制之后有交换,谁空谁是to;
  • 关于垃圾回收:频繁在新生区收集,很少在老年区收集,几乎不在永久区/元空间收集

8.堆

8.堆

8.堆

8.堆


8.堆

8.堆

所以说,堆空间并不都是共享的。

8.堆

空间分配担保

8.堆

8.堆

逃逸分析

如何快速判断是否发生了逃逸,看new的对象实体是否有可能在方法外被调用

8.堆