我有以下代码: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会被垃圾回收吗?或者我们需要明确删除元素。想从内存泄漏的角度来理解。任何指针都非常感谢。
2 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
没有明确的时间何时garbage collection
运行。每当没有对对象的引用时,它就符合garbage collection
.
当一个方法在 Java 中被调用时,它会进入堆栈帧。当该方法从堆栈中弹出时,其所有成员都会死亡。因此,他们有资格参加 gc。在方法执行后,在其中创建的对象变得不可访问或匿名,因此有资格进行垃圾收集。
慕容708150
TA贡献1831条经验 获得超4个赞
简短回答:是的,“emps”将被垃圾收集,不,您不需要显式删除 Java 中的元素。
更长的答案:假设您是 Java 和垃圾收集的新手(可能来自 C++ 背景?)那么到目前为止的答案可能会跳过您正在寻找的非常简单的答案。正如一些人指出的那样,您发布的代码在 Java 中无法完全编译,因此我们无法给出完美的答案。也就是说,我假设您真的只是在问我们是否必须在 Java 中显式释放内存:不,我们不需要。
从Java 垃圾收集基础:
在像 C 这样的编程语言中,分配和释放内存是一个手动过程。在 Java 中,释放内存的过程由垃圾收集器自动处理。
垃圾回收是一个复杂的话题,但您基本上可以相信 JVM 会在某个时间间隔识别“哪些对象正在使用,哪些未使用”,并会在某个时间间隔删除“未使用的对象”。因此,如果您允许 JVM 看到对象未使用,您可能不会在程序中打开任何“内存泄漏”——换句话说,不要在不需要对象时保留它们。
添加回答
举报
0/150
提交
取消