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

问题描述 投票:0回答:3

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

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

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

java object garbage-collection jvm
3个回答
0
投票

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

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

如果您有这样的代码

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

然后,一旦Foo完成,你创建的run将无法访问,因为没有更多变量引用它。 Foo将在一段时间后被销毁。当然,除非Foo的构造函数在一些令人讨厌的static数据存储中注册自己。

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


0
投票

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

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

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

  • “对象引用被破坏了” - 对象的存储被回收,没有“破坏引用”这样的东西
  • “当创建类关闭时” - 没有“关闭类”这样的事情
  • “当控件返回到调用类或者它们是否保留在内存中时,在CountWords类中创建的所有对象/集合是否被”销毁“? - 以这种形式,不容易回答 没有“破坏”这样的东西。垃圾收集的整个目的是允许重用内存。这意味着记录内存是免费的。但记忆本身并不需要触及。 当您的方法返回时,这些对象有资格进行垃圾回收。垃圾收集本身不必立即运行。当需要空闲内存或CPU负载较低时,可能会发生这种情况。 如上所述,即使垃圾收集器运行,结果是内存现在被认为是空闲的,不一定要“擦除”内存。因此,对象可能“保留在内存中”,直到实际被其他对象覆盖。所以这只是一个错误的问题。你真的想知道内存是否可以重用。
  • “如果是后者,我是否必须在退出类之前将每个对象设置为null以将其标记为集合?” - “后者”仍然意味着内存在语义上是自由的。但是你想要什么“设置为null”?引用不再存在。对象无法访问。 答案是你无能为力,你什么也做不了。这就是垃圾收集的全部要点,不需要你做任何事情。

0
投票

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

例如 :

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

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

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

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

这就是垃圾收集器进入的地方。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.