为了账号安全,请及时绑定邮箱和手机立即绑定

集合、单例、垃圾收集

集合、单例、垃圾收集

湖上湖 2021-09-26 18:59:57
我有以下代码: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。在方法执行后,在其中创建的对象变得不可访问或匿名,因此有资格进行垃圾收集。


查看完整回答
反对 回复 2021-09-26
?
慕容708150

TA贡献1831条经验 获得超4个赞

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

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

从Java 垃圾收集基础:

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

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


查看完整回答
反对 回复 2021-09-26
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信