Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GC在从作用域返回后收集引用的对象_Java_Garbage Collection - Fatal编程技术网

Java GC在从作用域返回后收集引用的对象

Java GC在从作用域返回后收集引用的对象,java,garbage-collection,Java,Garbage Collection,我有一个关于GC在Java中如何工作的问题。 考虑下面的代码: class C1 { ArrayList<int> myList = new ArrayList<int>(); public void setList(ArrayList<int> l) { myList = l; } } func(C1 C) { ArrayList<int> l1 = new ArrayList<int&

我有一个关于GC在Java中如何工作的问题。 考虑下面的代码:

class C1 {
    ArrayList<int> myList = new ArrayList<int>();

    public void setList(ArrayList<int> l) {
         myList = l;
    }
}

func(C1 C) {
    ArrayList<int> l1 = new ArrayList<int>();
    l1.add(1);
    C.setList(l1);
}

main() {
    C1 C = new C1();
    func(C);
    ...
}
我的问题是:
在func返回后,GC是否释放“l1”?

不,它不会释放,因为有一个根引用堆栈变量C,它有一个强引用myList,指向新的ArrayList。在main返回之后,C1和ArrayList是可收集的,因为根引用消失了。

不,它没有,因为有一个根引用堆栈变量C,它有一个强引用myList,指向新的ArrayList。在main返回之后,C1和ArrayList是可收集的,因为根引用消失了。

实际上HotSpot的JIT做了一个优化,即检测不再访问本地var的点并在那一刻清除它。因此,你的问题的完整答案是可能的,但不能保证。最近我玩了一些代码,测量了一个大数组占用的内存。直到我在方法的末尾插入array.hashCode之前,我观察到它是在更早的时候发布的。

实际上HotSpot的JIT做了一个优化,即检测不再访问本地变量的点并在那一刻清除它。因此,你的问题的完整答案是可能的,但不能保证。最近我玩了一些代码,测量了一个大数组占用的内存。直到我在方法的末尾插入ARRAY.HASCODE,我才发现它早就发布了。

是关于后面的主要结束的问题,或者你在想象中的其他与C严格无关的其他活动吗?不,考虑其他与C无关的活动。参考文献,ARARYLIST不是编译的东西。但是,ArayLead可能是关于后面的主要内容的问题,还是你设想的其他主要活动与C严格无关?不,考虑其他与C无关的活动。参考文献,ARARYLIST不是编译的东西。不过,ArrayList可能会。