在Thread.run()中创建新对象,何时进行垃圾回收?

时间:2013-08-01 14:24:17

标签: java

在扩展Thread的类中,请考虑以下示例:

public void run() {
   while (workToDo) {
        JSONObject json = new JSONObject(getNextMap());
        publishJSON(json.toString());
        //  thread sleep
   }
}

只要线程正在运行,每个json实例是否仍然被引用,或者每次调用new时它们是否被释放?是否应将其移至方法,即publishJSON(getJson(getNextMap())

1 个答案:

答案 0 :(得分:4)

要获得对象的引用,那么它必须是本地使用的变量(在本地范围内)或包含在类实例的成员变量中。

我没有在你的例子中看到任何两个,因为在每次while迭代之后,局部变量不再被引用。因此,除非您使用json执行某些操作,以便在其他位置保存对它的引用,否则它们有资格进行垃圾回收。

请注意,这并不意味着GC会在每次迭代后收集没有更多引用的实例,因为从开发人员的角度来看,它的行为是不可预测的。你只知道他们最终会被收集起来。