集合、单例、垃圾收集

我有以下代码:


public void method1() {

    Emp e1 = new Emp();

    Emp e2 = new Emp():

    Emp e3 = new Emp();

    method2(e1, e2, e3);

}


public void method2(Emp... emps) {

    List<Emp> emps = new ArrayList<>();

    for(final Emp emp : emps) {

        emps.add(emp);

    }

    // do some task with list

}

那么当method2返回时,emps会被垃圾回收吗?或者我们需要明确删除元素。想从内存泄漏的角度来理解。


任何指针都非常感谢。


湖上湖
浏览 122回答 2
2回答

慕工程0101907

没有明确的时间何时garbage collection运行。每当没有对对象的引用时,它就符合garbage collection.当一个方法在 Java 中被调用时,它会进入堆栈帧。当该方法从堆栈中弹出时,其所有成员都会死亡。因此,他们有资格参加 gc。在方法执行后,在其中创建的对象变得不可访问或匿名,因此有资格进行垃圾收集。

慕容708150

简短回答:是的,“emps”将被垃圾收集,不,您不需要显式删除 Java 中的元素。更长的答案:假设您是 Java 和垃圾收集的新手(可能来自 C++ 背景?)那么到目前为止的答案可能会跳过您正在寻找的非常简单的答案。正如一些人指出的那样,您发布的代码在 Java 中无法完全编译,因此我们无法给出完美的答案。也就是说,我假设您真的只是在问我们是否必须在 Java 中显式释放内存:不,我们不需要。从Java 垃圾收集基础:在像 C 这样的编程语言中,分配和释放内存是一个手动过程。在 Java 中,释放内存的过程由垃圾收集器自动处理。垃圾回收是一个复杂的话题,但您基本上可以相信 JVM 会在某个时间间隔识别“哪些对象正在使用,哪些未使用”,并会在某个时间间隔删除“未使用的对象”。因此,如果您允许 JVM 看到对象未使用,您可能不会在程序中打开任何“内存泄漏”——换句话说,不要在不需要对象时保留它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java