java类中的成员成员变量赋值之后什么时候会被回收,有什么办法监听到某一个对象被回收吗
阿神2017-04-18 10:52:02
オブジェクトがリサイクルされるかどうかは、現在のオブジェクトが参照されているかどうかだけでは判断されません。
JVM は、到達可能性分析アルゴリズムを使用して、GC ROOT によって到達できないノードがマークされます。オブジェクトが 2 回マークされると、そのノードはリサイクルされます。この到達可能性分析アルゴリズムについては、Baidu で自分で検索することができます。原理は非常に簡単です。
それでは、オブジェクトがリサイクルされているかどうかを監視するにはどのような方法が使用されるのでしょうか?もちろんフィアンリーゼを使いました
コードを参照してください:
リーリー実行結果:
リーリーそれは、ファイナライズを実行した後、オブジェクトは確実にリサイクルされるという意味ですか?実際、次のように、finalize が呼び出されたときにオブジェクトが自身を保存する機会が 1 回しかないということは必ずしも真実ではありません:
リーリー実行結果は以下の通りです:
リーリー最初のガベージ コレクション中に、finalize メソッドが現在のリサイクル オブジェクトに新しい参照を割り当ててリサイクルを回避していることがわかります。ただし、finalize メソッドはオブジェクトに対して 1 回だけ呼び出すことができ、実行中には呼び出されません。 2回目のリサイクルが呼び出されました。
上記の 2 つの例から結論付けることができます。finalize は、リサイクルされるオブジェクトを監視できますが、finalize が呼び出されたオブジェクトがリサイクルされるという保証はありません。同時に、オブジェクトは、finalize をトリガーすることはありません。は 2 回目のリサイクル対象としてマークされています。オブジェクトがリサイクルされているかどうかを完全に監視したい場合は、パラメータ -XX:+PrintGCDetails を JVM に追加して GC ログを分析するだけです