新生代对象分配与回收过程

1. 对象分配的一般过程

  1. new的对象先放在伊甸园区,此区有大小限制.
    image.png
  2. 当伊甸园区填满时,程序又需要创建对象,JVM将对伊甸园区进行垃圾回收,(Young GC),将伊甸园区不被引用的对象进行销毁,然后加载新的对象放到伊甸园区.
  3. 然后将伊甸园区还在使用的对象移动到幸存者0区
  4. 如果再次触发垃圾回收,此前存放在幸存者0区的对象,如果还没被回收,将会放到幸存者1区.
    image.png
  5. 如果在回收,此时重新放回幸存者0区,接着再去幸存者1区
  6. 什么时候能够去养老区呢? 可以设置次数默认是15次

image.png

  • 设置参数
-XX:MaxTenuringThreshold=<N>

2. 对象分配的特殊过程

image.png

  1. 新生代如果放不下的话(超大对象),直接将对象放到老年代.
  2. 如果老年也放不下的话,会进行垃圾回收(FGC).
  3. 如果进行FGC之后老年代任然放不下, 此时OOM (内存溢出).
  4. 如果进行YGC之后,但是to区放不下,那么会直接放到老年代去.

3. 程序演示

package com.coderman.heap;

import java.util.ArrayList;
import java.util.Random;

/**
 * -Xms600m -Xmx600m
 * @Author zhangyukang
 * @Date 2020/5/24 09:56
 * @Version 1.0
 **/
public class HeapInstanceTest {

    byte[] buffer=new byte[new Random().nextInt(1024*200)];

    public static void main(String[] args) {
        ArrayList<HeapInstanceTest> list=new ArrayList<>();
        while (true){
            list.add(new HeapInstanceTest());
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

image.png

image.png

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×