堆中新生代和老年代内存分配设置
默认:
新生代:老年代=1:2;
Eden:s0:s1=8:1:1;
最大晋升老年代的临界值:15;
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。
3、混合收集(Mixed GC):(部分收集 Partial GC)
新生代和部分老年代的垃圾收集。
只有G1 GC会有这种行为。
4、Full GC:(整堆收集)
整个Java 堆和方法区的垃圾收集。
对象(内存空间)分配的过程::
- 先存放Eden,若满了,触发Minor GC,将存活对象保存到S的to区,S的from和to区域转换。(S区是被动GC,Minor GC也会回收一次S区,并对幸存者年龄+1,超临界值晋升老年代)
- Minor GC再次触发,判断Eden和S from区存活对象,放到to区,S区的from和to区域再次转换。
- S区的对象经历了15次(可以通过-XX:MaxTenuringThreshold=进行设置)回收后还存活,则晋升到老年代中。当然还有其他情况(比如对象内存超过S区的剩余内存,直接晋升)下面再补充。
简要说明:
针对幸存者s0和s1:复制后有交换,谁空谁是to。
关于垃圾回收:频繁收集新生区,很少收集养老区,几乎不收集永久区和元空间。
对象分配的特殊情况
简单说明:
1、若Eden放不下–>YGC,还是放不下–>Old
2、Old放不下–>FGC,还是放不下–>OOM
java visuaVM的实例图:
内存分配和回收策略
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END