JAVA - 我应该在使用它之后为每个实例化对象设置null吗?

时间:2014-02-28 12:25:37

标签: java performance garbage-collection

我对Java垃圾收集器有疑问。为了说明,我有一个像这样的json:

List<Test_DTO> testes = new ArrayList();
JSONArray list = new JSONArray();

for (Test_DTO test : testes) {
    JSONObject obj = new JSONObject();

    if(test != null) 
        obj.put("codigo",""+test .getCodigo());

    list.put(obj);
}

list = null; 

我是否应该在文件末尾设置list = null,以便收集器可以“清理”它?如果是,我应该在obj = null之后的for内设置list.put(obj);吗?或(清洁)是否自动发生?正如我所说,这个问题不是特定于这个例子,只是为了让它更清楚地理解。

提前致谢,

卢卡斯。

4 个答案:

答案 0 :(得分:3)

无需将其设置为null。垃圾收集器会处理它。 看看这里是为了更好地理解。 http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

答案 1 :(得分:2)

这取决于具体情况。

如果您粘贴的代码是例如每小时运行一次的线程中的循环的一部分或长生命对象的属性,那么将null设置为list引用并允许GC是好的垃圾JSONArray

在大多数情况下你不必担心

答案 2 :(得分:1)

  

我是否应该在文件末尾设置list = null以便收集器可以“清理”它?

没有必要提供您引用的代码在方法中,list是方法中的局部变量。当方法返回时,局部变量被销毁,如果没有其他东西对这些变量所引用的对象有引用,则这些对象可用于垃圾收集。

如果list不是方法中的局部变量,它可能应该是。 : - )

但请注意,如果您在填写完成后没有使用list,那么该代码似乎没什么意义,因为这就是所有代码所做的。如果您在完成时将list分配给其他内容(将其作为属性放置在对象上等),则仍然无需将list设置为null ,但原因没有必要更改:如果您要保存list引用其他地方的列表,那么该列表将有一个未完成的引用,并且它将不符合条件垃圾收集(是否将list设置为null)。

答案 3 :(得分:0)

创建位图时,Android经常因内存不足而失败,并且不会先尝试进行垃圾回收。因此,请调用System.gc(),并且您有足够的内存来创建位图。

如果创建对象,我认为System.gc会在需要时自动调用,但不会创建位图。它失败了。

所以我建议在创建位图之前手动调用System.gc()。