1. [JVM 堆内存划分]
  2. :新生代 Young
  3. -> Eden
  4. # 新创建的对象会被分配到Eden区, 对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区
  5. # 对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中
  6. -> From Survivo
  7. -> To Survivor
  8. :老年代 Old
  9. # 目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收
  10. # 堆大小 = 新生代 + 老年代
  11. # 堆的大小可以通过参数 –Xms、-Xmx 来指定 , -Xms 初始的Heap的大小, -Xmx 最大Heap的大小
  12. => Xss 规定每个线程堆栈的大小, 一般情况下256K是足够了, 影响了进程中并发线程数大小

堆内存模型

image.png

堆GC示意图

image.png

后端技术栈 - JVM - 图3

[GC 堆]

    # 堆是 GC 收集垃圾的主要区域

  :Minor GC

    # 发生在新生代中的垃圾收集动作,所采用的是复制算法,新生代是 GC 收集垃圾的频繁区域

  :Full GC (Major GC)

    # 发生在老年代的垃圾收集动作,所采用的是标记-清除算法

JVM 参数选项

[参数含义]

    :-Xms     初始堆大小 如:-Xms256m

    :-Xmx     最大堆大小 如:-Xmx512m

    :-Xmn     新生代大小, 1/3Xmx 新生代 = Eden + 2*Survivor , 实际= Eden + 1 * Survivor,即 90%

    :-Xss     JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的

    :-XX:NewRatio     新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3

    :-XX:SurvivorRatio 新生代中 Eden/Survivor 的值, 默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10  

  :-XX:PermSize     永久代(方法区)的初始大小

    :-XX:MaxPermSize     永久代(方法区)的最大值

    :-XX:+PrintGCDetails     打印 GC 信息

    :-XX:+HeapDumpOnOutOfMemoryError     让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析