假设我有一个类,它加载一个文件,然后调用另一个方法来对该文件执行某些操作。例如,计算文件中的单词。
在CountWords类中,创建了许多对象/集合以获得单词数。运行该方法,找到单词的数量,然后将其返回给调用类。
我的问题是,当控件返回到调用类或者它们是否保留在内存中时,在CountWords类中创建的所有对象/集合是否被“销毁”?如果是后者,我是否必须在退出类之前将每个对象设置为null以标记它们以进行收集?
我们通常不会精确控制Java对象何时被销毁。它会在无法访问后的某个时间被破坏 - 换句话说,当在任何范围内没有进一步引用它时。
如果创建一个对象,并在另一个对象的字段中存储对它的引用,则只要可以访问对其具有引用的对象,就可以继续访问您创建的对象。
如果您有这样的代码
public void run() {
Foo a = new Foo();
System.out.println("This method is finished");
}
然后,一旦Foo
完成,你创建的run
将无法访问,因为没有更多变量引用它。 Foo
将在一段时间后被销毁。当然,除非Foo
的构造函数在一些令人讨厌的static
数据存储中注册自己。
因此,通常,您不需要将对null的设置引用设置为销毁对象。从垃圾收集器的角度来看,让这些引用超出范围就像将它们设置为null一样好。
Java是一种编程语言,具有内存管理即垃圾收集。基本答案是,垃圾收集器将负责回收未使用对象的内存。
但既然你已经用[garbage-collection]
标记了这个问题,你应该已经知道了。因此,您不清楚您想知道哪些其他细节或者您认为您的场景有何特殊之处,除了“有垃圾收集器”之外还需要一个额外的答案。
你的问题充满了错误或误导的短语。
null
”?引用不再存在。对象无法访问。
答案是你无能为力,你什么也做不了。这就是垃圾收集的全部要点,不需要你做任何事情。在出现函数后,我们不需要将对象设置为null。对于这个Java,有一个垃圾收集器,它在Java虚拟机上运行,它可以摆脱Java应用程序不再使用的对象。它是一种自动内存管理的形式。
例如 :
for (int i =0 ; i<10 ; i++) {
String s = String.valueOf(i)
}
在上面的代码中,整数s是在for循环的每次迭代中创建的。这意味着在每次迭代中,都会分配一小部分内存来生成整数对象。
回到代码,我们可以看到,一旦执行了一次迭代,在下一次迭代中,在上一次迭代中创建的整数对象不再被使用 - 该对象现在被认为是“垃圾”。
最终,我们将开始获得大量垃圾,并且内存将用于不再使用的对象。如果这种情况继续下去,最终Java虚拟机将耗尽空间来创建新对象。
这就是垃圾收集器进入的地方。
垃圾收集器将查找不再使用的对象,并清除它们,释放内存,以便其他新对象可以使用该内存。
像垃圾收集这样的自动内存管理方案使程序员不必过多担心内存管理问题,因此他或她可以更专注于开发他们需要开发的应用程序。