Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-当创建类关闭时对象引用会被破坏吗?_Java_Object_Garbage Collection_Jvm - Fatal编程技术网

Java-当创建类关闭时对象引用会被破坏吗?

Java-当创建类关闭时对象引用会被破坏吗?,java,object,garbage-collection,jvm,Java,Object,Garbage Collection,Jvm,假设我有一个类,它加载一个文件,然后调用另一个方法对该文件执行某些操作。例如,计算文件中的单词 在CountWords类中,创建了许多对象/集合以获取单词数。方法运行,找到字数,然后返回给调用类 我的问题是,当控件返回给调用类时,CountWords类中创建的所有对象/集合是否都被“销毁”了,还是仍保留在内存中?如果是后者,我是否必须在退出类之前将每个对象设置为null,以将它们标记为收集对象?我们通常无法准确控制Java对象何时被销毁。在它变得不可访问之后,它将被销毁——换句话说,在任何范围内

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

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


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

我们通常无法准确控制Java对象何时被销毁。在它变得不可访问之后,它将被销毁——换句话说,在任何范围内都没有对它的进一步引用

如果创建一个对象,并将对该对象的引用存储在另一个对象的字段中,则只要具有对该对象的引用的对象是可访问的,则创建的对象将继续可访问

如果你有这样的代码

public void run() {
    Foo a = new Foo();
    System.out.println("This method is finished");
}
然后,您创建的
Foo
将在
run
完成后立即无法访问,因为没有更多变量引用它<代码>Foo将在一段时间后销毁。当然,除非
Foo
的构造函数在某个讨厌的
静态
数据存储中注册了自己


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

我们通常无法准确控制Java对象何时被销毁。在它变得不可访问之后,它将被销毁——换句话说,在任何范围内都没有对它的进一步引用

如果创建一个对象,并将对该对象的引用存储在另一个对象的字段中,则只要具有对该对象的引用的对象是可访问的,则创建的对象将继续可访问

如果你有这样的代码

public void run() {
    Foo a = new Foo();
    System.out.println("This method is finished");
}
然后,您创建的
Foo
将在
run
完成后立即无法访问,因为没有更多变量引用它<代码>Foo将在一段时间后销毁。当然,除非
Foo
的构造函数在某个讨厌的
静态
数据存储中注册了自己


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

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

例如:

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

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

例如:

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

for(int i=0;iJava是一种具有内存管理的编程语言,也称为垃圾回收。基本答案是,垃圾回收器将负责回收未使用对象的内存

但是既然你已经用
[garbage collection]
标记了这个问题,你应该已经知道了这一点。因此,不清楚你还想知道什么额外的细节,或者为什么你认为你的场景在任何方面都是特别的,除了“有一个垃圾收集器”之外,你还应该得到一个额外的答案

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

  • “对象引用被销毁了吗”-对象的存储被回收,没有“销毁引用”这样的事情

  • “创建类关闭时”-没有“类关闭”之类的事情

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

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

    答案是你不能做什么,也不应该做什么。这就是垃圾收集的全部意义,你不需要做任何事情


    • Java是一种具有内存管理(又称垃圾收集)功能的编程语言。基本答案是