您如何看待Sonar的糟糕练习 - Finalizer只会使字段无效?

myu*_*uce 2 java garbage-collection sonarqube

当你做下面的事情,

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

    this.aVeryBigComponent = null;

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

    super.finalize();
}
Run Code Online (Sandbox Code Playgroud)

声纳抱怨

不好的做法 - Finalizer只会使字段为空

findbugs:FI_FINALIZER_ONLY_NULLS_FIELDS

除了字段外,此终结器不执行任何操作.这是完全没有意义的,并且要求对象被垃圾收集,最终确定,然后再次收集垃圾.你应该删除finalize方法.

只要我知道将字段设置为null有助于垃圾收集器在第一次运行/生成中销毁对象.如果我没有将该字段设置为null,则该对象可能会被发送到第二代并等待更多.

你怎么看?

Jon*_*eet 8

如果我没有将该字段设置为null,则该对象可能会被发送到第二代并等待更多.

如果您根本没有终结器,那么您的对象将有资格进行垃圾收集,并且其字段不会被计为GC根,因此其他对象可能同时有资格进行垃圾收集.

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

在Java中编写终结器是非常非常好的主意...如果它只是将字段设置为null,那肯定是一个坏主意.(这几乎肯定会损害性能,而不是帮助它.)