Java - 创建类关闭时是否会破坏对象引用?

时间:2017-11-14 19:02:32

标签: java object garbage-collection jvm

假设我有一个类,它加载一个文件,然后调用另一个方法对该文件执行某些操作。例如,计算文件中的单词。

在CountWords类中,创建了许多对象/集合以获取单词数。运行该方法,找到单词的数量,然后将其返回给调用类。

我的问题是,当控件返回到调用类或者它们是否保留在内存中时,在CountWords类中创建的所有对象/集合是否被“销毁”?如果是后者,我是否必须在退出类之前将每个对象设置为null以将其标记为集合?

3 个答案:

答案 0 :(得分:0)

我们通常无法准确控制Java对象何时被销毁。它会在无法访问后的某个时间被破坏 - 换句话说,在任何范围内都没有进一步引用它。

如果创建一个对象,并在另一个对象的字段中存储对它的引用,则只要可以访问对其具有引用的对象,就可以继续访问您创建的对象。

如果你有这样的代码

public void run() {
    Foo a = new Foo();
    System.out.println("This method is finished");
}

然后Foo完成后,您创建的run将无法访问,因为没有更多变量可以引用它。 Foo之后会被摧毁。当然,除非Foo的构造函数在某个地方的某个讨厌的static数据存储中注册自己,否则会有一些魔力。

因此,一般来说,您不需要将对null的引用设置为null来销毁对象。从垃圾收集器的角度来看,让这些引用超出范围就像将它们设置为null一样好。

答案 1 :(得分:0)

我们不需要在出现函数后将对象设置为null。对于这个Java,有一个垃圾收集器,它在Java虚拟机上运行,​​它可以摆脱Java应用程序不再使用的对象。它是一种自动内存管理。

例如:

for (int i =0 ; i<10 ; i++) {
    String s = String.valueOf(i)
}

在上面的代码中,在for循环的每次迭代中都会创建整数s。这意味着在每次迭代中,都会分配一小部分内存来生成整数对象。

回到代码,我们可以看到,一旦执行了一次迭代,在下一次迭代中,在上一次迭代中创建的整数对象不再被使用 - 该对象现在被认为是&#34 ;垃圾&#34;

最终,我们将开始获得大量垃圾,并且内存将用于不再使用的对象。如果这种情况继续下去,最终Java虚拟机将耗尽空间来创建新对象。

垃圾收集器进入的地方。

垃圾收集器将查找不再使用的对象,并清除它们,释放内存,以便其他新对象可以使用该内存。

像垃圾收集这样的自动内存管理方案使得程序员不必过多担心内存管理问题,因此他或她可以更专注于开发他们需要开发的应用程序。

答案 2 :(得分:0)

Java是一种编程语言,具有内存管理即垃圾收集。基本的答案是,垃圾收集器将负责回收未使用对象的内存。

但是,既然您已使用[garbage-collection]标记了问题,那么您应该已经知道了这一点。因此,目前尚不清楚您想知道哪些其他细节或者您认为您的场景有何特殊之处,除了“有垃圾收集器”之外还需要一个额外的答案。

你的问题充满了错误或误导的短语。

  • 对象引用被破坏” - 回收对象的存储,没有“破坏引用”

  • 当创建课程关闭时” - 没有“关闭课程”这样的事情

  • 当控件返回到调用类时,在CountWords类中创建的所有对象/集合是否被”销毁“?它们是否保留在内存中?” - 以这种形式,不简单回答

    • 没有“破坏”这样的东西。垃圾收集的整个目的是允许重用内存。这意味着记录内存是免费的。但记忆本身并不需要触及。
    • 当您的方法返回时,这些对象符合条件进行垃圾回收。垃圾收集本身不必立即运行。当需要空闲内存或CPU负载较低时,可能会发生这种情况。
    • 如上所述,即使垃圾收集器运行,结果是内存现在被认为是空闲的,不一定要“擦除”内存。所以对象可能“保留在内存中”,直到实际被其他对象覆盖。所以这只是一个错误的问题。你真的想知道内存是否可以重用。
  • 如果是后者,我是否必须在退出类之前将每个对象设置为null以将其标记为集合?” - “后者”仍暗示内存是免费的,语义上。但你想“设置为null”是什么?引用不再存在。对象无法访问。

    答案是你无能为力,你什么都不应该做。这就是垃圾收集的全部要点,不需要你做任何事情。