【问题标题】:How to free memory inside a for loop of creating multiple object? [closed]如何在创建多个对象的 for 循环中释放内存? [关闭]
【发布时间】:2015-01-07 00:50:44
【问题描述】:

在下面的代码中 - 对象 s2 创建了 10000000 次并添加到列表中 - samp2 将在外部某处使用。它会 [created objects] 通过将其设为 null 来获得 GC 吗?

谁能解释一下?

如果它没有发生GC,那么如何实现GC,因为创建了这么多对象并添加到列表中并没有用?

请帮我解决这个问题?

/----------* /

List<SampleBean> samp2=new ArrayList<>();


for(int i=1;i<10000000;i++){

        SampleBean s2=new SampleBean();

        s2.x=i;

        samp2.add(s2);
        s2=null;
}

/SampleBean 类/

public class SampleBean{

  int x;

}

注意:samp2 是保存对象的列表,它将在外面使用。

【问题讨论】:

  • 或许可以阅读有关垃圾收集的基本教程。如果你搜索,你会发现很多。我不禁要注意您的生物状态,您有 3.3 年的 Java 经验。是时候阅读垃圾收集了...?
  • 嗨 Jigar Joshi,感谢您的 cmets。我目前正在尝试了解垃圾收集过程。为此,我试图在对象使用后取消引用[添加到列表后]。为此我提出了这个问题。您能否建议一些 GC 过程的站点链接以及示例? :)

标签: java object garbage-collection


【解决方案1】:

只有当没有其他对象持有对它的任何引用时,才会对对象进行垃圾回收。

在这种情况下,由于您仍然持有对 samp2 的引用,而该引用本身持有对每个元素的引用,因此它们不会被垃圾回收。

还有,那个

s2 = null;

无关紧要,因为 s2 变量范围只是那个块。因此,一旦到达块的末尾,该变量将不复存在。

如果您希望一个对象被垃圾回收,您只需确保您没有持有任何其他对它的引用。在这种情况下,您只需将其从 samp2 ArrayList 中删除即可。

【讨论】:

  • 嗨@manecosta,谢谢你的信息。但无论如何我无法从 samp2 arrayList 中删除 s2 对象,因为 arrayList 需要在循环之外。还有其他方法可以实现 GC 吗?有什么建议吗?
  • 我不明白你到底想要什么。如果您需要循环外的 samp2 内的对象,为什么要对它们进行垃圾收集?如果您只需要 samp2 数组本身,那么没有什么能阻止您移除其中的对象。
  • 嗨@manecosta,我在这里解释我的理解。 SampleBean 的对象在 for 循环中被重复创建 [如此多的新对象和相应的内存] 并添加到列表中。内存被创建的对象占用。一旦添加到列表中,我正在尝试释放为该对象创建的内存。我只想要数组 samp2 一旦它被 SampleBean 对象填充。根据你的建议如何移除里面的物体?如果我的理解有误,请纠正我?
  • 您似乎想释放这些对象使用的内存,但同时又不想丢失这些对象。如果不在内存中,对象将存储在哪里?
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2011-12-22
相关资源
最近更新 更多