当您执行以下操作时,

@Override
protected void finalize() throws Throwable {
    ////////////////////////

    this.aVeryBigComponent = null;

    ////////////////////////

    super.finalize();
}

声纳抱怨

不好的做法-终结器只能使字段为空
findbugs:FI_FINALIZER_ONLY_NULLS_FIELDS
该终结器除了空出字段外不执行任何操作。这是完全没有意义的,并且要求先对对象进行垃圾收集,终结处理,然后再次进行垃圾收集。您应该只删除finalize方法。

只要我知道将字段设置为null就能帮助垃圾收集器在第一次运行/生成时销毁对象。如果我不将该字段设置为null,则该对象可能会发送给第二代,并且将等待更多时间。
你怎么看?

最佳答案

如果我不将该字段设置为null,则该对象可能会发送给第二代,并且将等待更多时间。


如果您根本没有终结器,那么您的对象将可以更早地进行垃圾收集,并且其字段也不会被视为GC根,因此其他对象可能会同时被进行垃圾收集。

即使您确实需要终结器,除非该终结器使该对象复活,否则该终结的对象仍然可以进行垃圾回收,因此其字段不会使其他对象保持活动状态。

用Java编写终结器很少是一个好主意...如果只是将字段设置为null,那绝对不是一个好主意。 (它几乎肯定会损害性能而不是帮助性能。)

关于java - 您如何看待Sonar的不良做法-终结器仅使字段为空?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18590936/

10-10 18:32