3分钟搞懂jvm垃圾回收机制

几句话概括jvm垃圾回收机制

1. jvm在堆内存中分为新生代和老年代。

2. 新生代中分为eden区和from区、to区。新来的对象会放到eden区内。当eden区放不下了,会将eden区的对象一道from区。要是from区装不下,就放到将from区里的对象移到to区。如果to区内存也不够,to区中的东西会先查from区,from区不够,则会放到老年代内存中,此时该对象的年龄加一。当from区或者to区有足够内存空间了,从老年代移到from区和to区。当对象年龄大于一定阈值的时候(XX:MaxTenuringThreshold),对象被当作垃圾回收。

3. 在2中,每一次移动都会是一个minor GC。当老年代空间满了,会发生full gc。

4. 在程序执行的维度看下垃圾回收:

public static void testGc() {
        {
            byte[] b = new byte[1024 * 1024];
        }
        int c = 0;
        System.gc();
    }

这个程序,b被分了1M的内存,一个引用架在了变量b和1M内存之间。此时,b和1m内存被牢牢的连在一起,如果立马进行gc,那么肯定是不成功的。之后出了作用域,来了一个新的变量c,原先b的栈帧会在栈内存中出栈,之后c的栈帧进栈,并和0绑定在一起。此时运行gc,那么原先b所拥有的1M内存会被释放。

猜你喜欢

转载自blog.csdn.net/qilinxo/article/details/85683867