收集,单例,垃圾收集

时间:2018-09-17 22:43:11

标签: java garbage-collection

我有以下代码:

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 个答案:

答案 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查看未使用的对象,则可能不会在程序中打开任何“内存泄漏”,换句话说,不要在不需要对象时保留它们。