JVM-内存分配及GC简单说明

堆中新生代和老年代内存分配设置

默认:

新生代:老年代=1:2;

Eden:s0:s1=8:1:1;

最大晋升老年代的临界值:15;

1625907060839.png

GC类型:(新生代、老年代、方法区)

1、YGC/Minor GC:(部分收集 Partial GC)

新生代Eden内存满了,触发。

若Survivor满了,不会触发垃圾回收,它也会跟着YGC/Minor GC回收,存放到老年代中。

会STW,暂停所有用户线程,但速度快。

2、OGC/Major Gc:(部分收集 Partial GC)

老年代内存满了,触发。

Major GC比Minor GC慢10倍,并STW的时间更长。(更少的Major GC,性能更好)

Major GC后,内存还不足,则报OOM。

1625912144780.png

3、混合收集(Mixed GC):(部分收集 Partial GC)

新生代和部分老年代的垃圾收集。

只有G1 GC会有这种行为。

4、Full GC:(整堆收集)

整个Java 堆和方法区的垃圾收集。

1625912118010.png

对象(内存空间)分配的过程::

  1. 先存放Eden,若满了,触发Minor GC,将存活对象保存到S的to区,S的from和to区域转换。(S区是被动GC,Minor GC也会回收一次S区,并对幸存者年龄+1,超临界值晋升老年代)
  2. Minor GC再次触发,判断Eden和S from区存活对象,放到to区,S区的from和to区域再次转换。
  3. S区的对象经历了15次(可以通过-XX:MaxTenuringThreshold=进行设置)回收后还存活,则晋升到老年代中。当然还有其他情况(比如对象内存超过S区的剩余内存,直接晋升)下面再补充。

1625907800705.png
1625908126558.png
1625907649664.png

简要说明:

针对幸存者s0和s1:复制后有交换,谁空谁是to。

关于垃圾回收:频繁收集新生区,很少收集养老区,几乎不收集永久区和元空间。

对象分配的特殊情况

1625910400037.png

简单说明:

1、若Eden放不下–>YGC,还是放不下–>Old

2、Old放不下–>FGC,还是放不下–>OOM

java visuaVM的实例图:

1625911058807.png

内存分配和回收策略

1625914381710.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享