我有以下代码:
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进行垃圾收集吗?或者我们需要显式删除元素。想从内存泄漏的角度理解。
任何指针都非常感谢。
答案 0 :(得分:2)
garbage collection
没有确定的时间运行。只要没有对对象的引用,它就会有资格使用garbage collection
。
在Java中调用方法时,它将进入堆栈框架。从堆栈中弹出该方法时,其所有成员都会死亡。因此,他们有资格获得gc。方法执行后,在其中创建的对象将变得不可访问或匿名,从而可以进行垃圾回收。
答案 1 :(得分:1)
简短的答案:是的,“ emps”将被垃圾收集,并且否,您不需要显式删除Java中的元素。
更长的答案:假设您是Java和Garbage Collection的新手(也许来自C ++背景?),那么到目前为止的答案可能是跳过您正在寻找的非常简单的答案。正如某些人指出的那样,您发布的代码无法完全在Java中编译,因此我们无法给出完美的答案。就是说,我想您真的是在问我们是否必须显式地释放Java中的内存:不,我们不需要。
来自Java Garbage Collection Basics:
在像C这样的编程语言中,分配和取消分配内存是手动过程。在Java中,垃圾回收器会自动处理释放内存的过程。
垃圾收集是一个复杂的主题,但是您可以相信,JVM会在一定间隔内标识“ 正在使用哪些对象,哪些没有使用”,并删除“ 未使用的对象”。因此,如果允许JVM查看未使用的对象,则可能不会在程序中打开任何“内存泄漏”,换句话说,不要在不需要对象时保留它们。