Java 收集、单例、垃圾收集

Java 收集、单例、垃圾收集,java,garbage-collection,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) {

我有以下代码:

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
}
公共作废方法1(){
Emp e1=新的Emp();
Emp e2=新Emp():
Emp e3=新的Emp();
方法2(e1、e2、e3);
}
公共无效方法2(Emp…Emp){
List emps=new ArrayList();
用于(最终环境管理计划环境管理计划:环境管理计划){
emp.add(emp);
}
//用列表做一些任务
}
那么当method2返回时,EMP会被垃圾收集吗?或者我们需要显式删除元素。希望从内存泄漏的角度来理解


非常感谢任何指针。

垃圾收集运行的时间不确定。只要没有对对象的引用,它就有资格进行
垃圾收集


在Java中调用一个方法时,它会进入堆栈框架。当该方法从堆栈中弹出时,其所有成员都将死亡。因此,他们有资格获得gc。方法执行后,在其内部创建的对象变得不可访问或匿名,因此有资格进行垃圾收集。

简短回答:是,“EMP”将被垃圾收集,否,您不需要显式删除Java中的元素

<强>更长的回答< /强>:假设你是java和垃圾回收的新手(也许是C++背景)?那么到目前为止的答案可能是跳过你正在寻找的简单答案。正如一些人所指出的,您发布的代码不会用Java编译,因此我们无法给出一个完美的答案。这就是说,我假设您真的只是问我们是否必须在Java中显式释放内存:不,我们不需要

发件人:

在像C这样的编程语言中,分配和释放内存是一个手动过程。在Java中,释放内存的过程由垃圾收集器自动处理


垃圾收集是一个复杂的主题,但您可以从本质上相信JVM将在某个时间间隔内识别“哪些对象正在使用,哪些没有使用”,并在某个时间间隔内删除“未使用的对象”。因此,如果允许JVM看到对象未被使用,那么很可能不会在程序中打开任何“内存泄漏”——换句话说,在不需要对象时不要保留它们

这不会编译。“method2什么时候返回EMP会被垃圾收集?”迂腐的回答:不太可能,因为GC可能不会运行一段时间<当
method2
返回时,code>emp将符合GC的条件,但是GC的实际行为不会发生,直到JVM选择这样做,并且您不知道什么时候可能会发生。--此外,当
method2
返回时,只有
emp
符合GC条件。3个
Emp
对象仍然由
method1
中的局部变量引用,因此在
method1
返回之前,它们不符合GC的条件。您的代码示例中没有任何单例,但在标题中提到了它们。编辑标题或正文,使之相互匹配。旁注:要从varargs参数中获取
List
,只需使用
List empsList=Array.asList(emps)