Java 在循环中添加到集合的对象何时将被垃圾收集?

Java 在循环中添加到集合的对象何时将被垃圾收集?,java,garbage-collection,Java,Garbage Collection,在下面的代码中 List<SomeObject> someObjectList = new ArrayList<SomeObject>(); do { SomeObject someObject = new SomeObject(); someObjectList.add(someObject); } while(some condition is met); List someObjectList=new ArrayList(); 做{ Som

在下面的代码中

List<SomeObject> someObjectList = new ArrayList<SomeObject>();

do {

    SomeObject someObject = new SomeObject();

    someObjectList.add(someObject);

} while(some condition is met);
List someObjectList=new ArrayList();
做{
SomeObject SomeObject=新的SomeObject();
添加(someObject);
}同时(满足一定条件);
我的问题

  • 什么时候收集某个物品
  • 我在这里泄漏内存吗
  • 什么时候收集某个物品

    someObject
    将在无法访问时进行GCed。在提供的简单示例中,当发生以下任一情况时,可能会发生这种情况:

    • someObjectList
      不再可访问
    • someObject
      someObjectList
      中删除(从而使其不再可访问)
    我在这里泄漏内存吗

    据我所知,您的代码中没有内存泄漏的迹象

    什么时候收集某个物品

    someObject
    将在无法访问时进行GCed。在提供的简单示例中,当发生以下任一情况时,可能会发生这种情况:

    • someObjectList
      不再可访问
    • someObject
      someObjectList
      中删除(从而使其不再可访问)
    我在这里泄漏内存吗


    据我所知,您的代码中没有内存泄漏的迹象。

    someObject
    在您的循环退出之前不会被GC。这是否是内存泄漏有待解释。如果您希望在仍然迭代时释放它,那么您正在泄漏。如果不是,那么您就不是。

    someObject
    在您的循环退出之前不会被GC'd。这是否是内存泄漏有待解释。如果您希望在仍然迭代时释放它,那么您正在泄漏。如果不是,那么就不是。

    someObject
    是一个局部变量,它永远不会被垃圾收集。这个
    someObject
    是堆栈或寄存器中的“某物”。局部变量本身不是java对象

    someObject
    临时保存对
    someObject
    实例的引用。该引用存储在数组列表中的数组中


    SomeObject
    的此实例将在没有其他对象持有对该实例的引用之后的某个时间被垃圾收集。

    SomeObject
    是一个局部变量,永远不会被垃圾收集。这个
    someObject
    是堆栈或寄存器中的“某物”。局部变量本身不是java对象

    someObject
    临时保存对
    someObject
    实例的引用。该引用存储在数组列表中的数组中



    SomeObject的这个实例
    将在没有其他对象引用该实例之后的某个时间被垃圾收集。

    您昨天提出的问题的公认答案已经包含了答案。这不是同一个问题,OP在循环的本地范围之外添加了一个集合,并将创建的对象放置在该集合中。这与前面的问题不同,在这个问题中没有这样的集合。我知道,但答案解释了如果对象存储在循环外部的某个对象中会发生什么,这正是OP在这个问题中所做的。我没说这个问题是个骗局。我已经说过,答案已经回答了第二个问题。在这一点上我同意你的看法。我想我是在浪费记忆。从
    ArrayList.java
    constructor
    this.elementData=newobject[initialCapacity]
    这意味着当
    List someObjectList=new ArrayList()时,我在堆栈中保留内存我再次保留内存
    SomeObject SomeObject=new SomeObject()
    之后,我将
    new SomeObject()'保留的内存引用传递给
    someObjectList`。您昨天提出的问题的公认答案已经包含了答案。这不是同一个问题,OP在循环的本地范围之外添加了一个集合,并将创建的对象放置在该集合中。这与前面的问题不同,在这个问题中没有这样的集合。我知道,但答案解释了如果对象存储在循环外部的某个对象中会发生什么,这正是OP在这个问题中所做的。我没说这个问题是个骗局。我已经说过,答案已经回答了第二个问题。在这一点上我同意你的看法。我想我是在浪费记忆。从
    ArrayList.java
    constructor
    this.elementData=newobject[initialCapacity]
    这意味着当
    List someObjectList=new ArrayList()时,我在堆栈中保留内存我再次保留内存
    SomeObject SomeObject=new SomeObject()
    之后,我将
    new SomeObject()'保留的内存引用传递给
    someObjectList`.@pst我的意思是,当它没有被引用时。不是以英语为母语的人。即使这样也不是真的。如果一个强引用的对象无法再访问,那么它可以被GCed。@实际上,他是这么说的。当列表不再被引用时,该列表项将符合GC的条件。我认为关于引用和可访问以及强弱的措辞会混淆OP的假定概念级别。在这种情况下,可能最好保持简单,以便更好地服务于那些会询问此类问题的人问题。@TimBender:我同意强/弱引用。但我不同意引用计数/可达性。如果你说重要的是引用的数量,那么对象图(经常使用)就不能再进行GCD了,在Java中不是这样。@pst我的意思是,当它没有被引用时。不是以英语为母语的人。即使这样也不是真的。强烈的