【问题标题】:Is it helpful to set the variable and object to null?将变量和对象设置为 null 是否有帮助?
【发布时间】:2016-04-27 09:51:56
【问题描述】:

我想优化我的代码,并有一个小问题。如果我这样做:

TextView currentConsole = (TextView)findViewById(R.id.txt_Mainactvt_currentConsole);
String currentConsoleName = currentConsole.getText().toString();
currentConsole = null;
FloatingActionButtonClickEvent(currentConsoleName);

设置对象为null是好办法,还是没用?

【问题讨论】:

  • 你为什么要这个?
  • 您将 object 设置为 null 的目的是什么?
  • @SamuelKerrien 我会知道这是否是一种优化代码的方法。这是因为它被垃圾收集而无用吗?
  • 如果您的应用程序长时间停留在该范围内并且此后您不再需要该对象,如果该对象确实非常巨大,这可能是内存使用的优化。否则就让它超出范围,除非有其他对同一对象的引用,否则它将被 gc-ed。
  • 如果@Fildor描述的情况是这样的话,你的变量范围可能还是太大了。手动清空变量几乎总是在代码中增加额外的复杂性而没有任何好处。

标签: java android performance object null


【解决方案1】:

垃圾收集器跟踪对您的对象的引用,当没有指向某个对象的指针时,它被标记为删除。它不会立即删除。所以当你写currentConsole = null;时,你只是告诉gc控制台对象应该被删除,它将在下一次垃圾回收中。

为了优化你可以调用System.gc();这将触发收集,但gc可能会选择忽略它,因此不能保证在空分配后控制台对象会被删除。

垃圾收集间隔是在运行时计算的,主要取决于对象的数量和新分配的频率,所以你能做的最好的事情就是让 GC 完成它的工作,在大多数情况下他做的最好.

最后是关于一般的空赋值,是的,它们在极少数情况下很有用,考虑这段代码

void testGCMethod()
{
    //Create very big object
    VeryBigObjectType o = new VeryBigObjectType();
    //do dometinh with o
    o.someMethod();

    //Do something that takes long time to complete that doesn't involve o
    Thread.sleep(1000 * 1000 * 1000);
}// end of method meaning the o pointer has just been freed and the big object has just been marked for deletion.

所以在这种情况下(如果 JIT 没有重新排列代码)VeryBigObjectType 实例将一直保存在内存中,因此一些开发人员喜欢将 o 分配给 null 以便 GC 尽快收集

void testGCMethod()
{
    //Create very big object
    VeryBigObjectType o = new VeryBigObjectType();
    //do dometinh with o
    o.someMethod();
    o=null;


    //Do something that takes long time to complete that doesn't involve o
    Thread.sleep(1000 * 1000 * 1000);
}// end of method meaning the o pointer has just been freed and the big 

这样大对象将在 Thread.sleep 之前被删除(可能)并节省一些内存;

【讨论】:

  • 即使这看起来正确,它也不会影响 OPs 代码,因为 TextView 不会被 GC 删除,因为应用程序的内部仍然会保留对它的引用(因为它需要显示它)。
  • 是的,你是对的,在我的例子中,关于 null,我说的是一般情况,而不是特定情况,但是在他的情况下,null 没有任何作用。
  • 是的,我知道,我只是想指出,在 OP 的情况下它没有帮助:P。答案本身并没有错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2014-04-11
相关资源
最近更新 更多