• 局部变量表中Slot复用对垃圾回收的影响详解


    看两段代码
    1.

    package com.jvm;
    
    public class Test {
        public static void main(String[] args) {
            {
                byte[] placeholder = new byte[64 * 1024 * 1024];
                //不加这个b看不到局部变量表中的placeholder,
                // 因为最后一个变量总是会看不到
                int b = 0;
            }
            System.gc();
        }
    }
    

    加入运行时参数-verbose:gc看一下内存,明显64000K的数组没被回收
    在这里插入图片描述
    javac -g Test.java 编译一下
    javap -verbose Test.class 查看字节码
    看局部变量表LocalVariableTable
    在这里插入图片描述
    Slot从1开始的,前面0是mian方法的参数args,如果不是main方法那0是调用方法的对象的引用this
    这里Slot没有被复用,所以作为GC Roots的一部分的局部变量表仍保持着对它的关联,这种关联没有被及时打断,所以GC回收不了它
    2.

    package com.jvm;
    
    public class Test {
        public static void main(String[] args) {
            {
                byte[] placeholder = new byte[64 * 1024 * 1024];
                int b = 0;
            }
            int a = 0;
            System.gc();
        }
    }
    

    回收成功
    在这里插入图片描述在这里插入图片描述
    这里的int a复用了placeholder占用的从1开始的空间,所以GC Roots被覆盖掉了,所以成功回收

    不过在经过JIT编译器的优化后,是可以正确回收内存的,所以不用太担心这个问题

  • 相关阅读:
    Python之从头开始建立项目流程
    Python之建立APP流程以及SVN 的使用
    python之继承
    Python之实例对象的增删改查
    Python之类属性的增删改查
    read big file
    python minus 3 days or n days
    movie
    pyqt convert ui file to py file
    pyqt4 borderless window
  • 原文地址:https://www.cnblogs.com/fatmanhappycode/p/12231196.html
Copyright © 2020-2023  润新知