假设我有一个类,它加载一个文件,然后调用另一个方法对该文件执行某些操作。例如,计算文件中的单词。
在CountWords类中,创建了许多对象/集合以获取单词数。运行该方法,找到单词的数量,然后将其返回给调用类。
我的问题是,当控件返回到调用类或者它们是否保留在内存中时,在CountWords类中创建的所有对象/集合是否被“销毁”?如果是后者,我是否必须在退出类之前将每个对象设置为null以将其标记为集合?
答案 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类中创建的所有对象/集合是否被”销毁“?它们是否保留在内存中?” - 以这种形式,不简单回答
“如果是后者,我是否必须在退出类之前将每个对象设置为null以将其标记为集合?” - “后者”仍暗示内存是免费的,语义上。但你想“设置为null
”是什么?引用不再存在。对象无法访问。
答案是你无能为力,你什么都不应该做。这就是垃圾收集的全部要点,不需要你做任何事情。