Java では、オブジェクトに参照がない場合、そのオブジェクトはゴミになり、期限までにリサイクルされずにメモリが解放されると、ゴミはどんどん蓄積され、最終的にはメモリ不足になり、JVM が停止します。ランニング。
混乱している人もいます。通常、コーディング時にオブジェクトを明示的に破棄することはありません。では、どうすればプログラムを適切に実行できるのでしょうか?
これは、jvm のデーモン スレッド GC についてです。GC は、特定のアルゴリズムに従って、ガベージ オブジェクトを時々解放し、メモリの高可用性を確保します。プロセス。
次のコードを見てみましょう:
public class DemoDatatype {
public static void main(String[] args) {
new DemoDatatype();
System.gc();
System .out .println("over!");
}
@Override
protected void Finalize() throws Throwable {
System.out.println("ガベージコレクションの前に作業してください!");
super.finalize (;?少なくとも上記の結果は、JVM には十分なメモリがあり、リソースを非常に消費するため、わざわざリサイクルする必要がないため、リサイクルは行われていないことがわかります。 Java.lang.System にはクラスの下に静的メソッド GC () があり、それを積極的に呼び出すように GC に依頼できます。ただし、GC はリクエストにすぐに応答するとは限りません。途中で渋滞が発生する可能性があり、いつ到着するかは不明です。 gc() を実行して結果を確認します。
public class DemoDatatype {
public static void main(String[] args) {
new DemoDatatype();
System.gc();
System.out. ("オーバー!");
}
@Override
protected void Finalize() throws Throwable {
System.out.println("ガベージコレクションの前に作業してください!");
super.finalize() ;
}
}
プログラムの出力: 以上です!
ガベージ コレクションの前に作業してください!
または: ガベージ コレクションの前に作業してください。
オーバー!
GC はガベージ コレクションの前に Finalize() メソッドを実行します。異常な手段でメモリが開かれた場合、GC は new を通じて適用されたオブジェクトのみを認識します。
Finalize() の機能は、ガベージ コレクションの前に、「新しいものではない」メモリ、閉じられていない IO など、gc によってリサイクルできない一部のリソースなどの一部のリソースを解放することです。ただし、リソースを解放するために Finalize() に依存しないように注意してください。GC に到達できず、メモリ リークが発生する可能性があります。
GC はどのような状況でトリガーされますか?
1) GC はサービス業界のメンバーとして、優先度が最も低いため、アプリケーションがアイドル状態のときにのみ開始されます。
2) メモリが不足し、アプリケーションが停止寸前になると、GC が前進してガベージを削除し、メモリを解放します。メモリ リークが深刻な場合、JVM は実行を停止します。
GC 作業ではシステム リソースも消費されます。不必要なオーバーヘッドを回避するにはどうすればよいですか?
1) ガベージを作成しないでください: 一時オブジェクトの使用を減らします。やむを得ず、使用後は空のままにしておきます
2) 積極的に GC を要求しないでください: system.gc() を明示的に呼び出さないでください
3) オブジェクト明確なライフサイクルを持ち、積極的に破棄します
4) 多数の文字列を結合するなど、大量の役に立たないオブジェクトを集中的に作成することを避けます
5) コーディング プロセス中のメモリ リークに注意して、コードの厳密性を確保しますコード。