Java では、クラスのオブジェクトを作成すると、メモリ (ヒープ) 内のスペースが占有されます。これらのオブジェクトを削除しないと、メモリ内に残り、プログラミングの観点から見て不必要な領域を占有することになります。この問題を解決するには、 駆逐艦 。このセクションでは、次の代替オプションについて説明します。 Javaのデストラクタ 。また、その使い方も学びます。 ファイナライズ() メソッドをデストラクターとして使用します。
の 駆逐艦 コンストラクターの逆です。コンストラクターはオブジェクトの初期化に使用され、デストラクターはオブジェクトが占有しているリソースを解放するオブジェクトの削除または破棄に使用されます。
覚えておいてください Javaにはデストラクタという概念がありません 。 Java は、デストラクターの代わりに、デストラクターと同じように動作するガベージ コレクターを提供します。ガベージ コレクターは、上で実行されるプログラム (スレッド) です。 JVM 。未使用のオブジェクト (もう使用されなくなったオブジェクト) を自動的に削除し、メモリを解放します。プログラマはメモリを手動で管理する必要がありません。エラーが発生しやすく、脆弱であり、メモリ リークを引き起こす可能性があります。
Javaのデストラクタとは何ですか?
これは、オブジェクトが使用されなくなったときに自動的に呼び出される特別なメソッドです。オブジェクトのライフサイクルが完了すると、ガベージ コレクターはそのオブジェクトを削除し、オブジェクトが占有していたメモリの割り当てを解除または解放します。
としても知られています ファイナライザー それは非決定的です。で ジャワ 、によって処理されるオブジェクトの割り当てと割り当て解除。 ガベージコレクター 。ファイナライザーの呼び出しは暗黙的に呼び出されるため、保証されません。
デストラクターの利点
- オブジェクトが占有しているリソースを解放します。
- 明示的な呼び出しは必要なく、プログラム実行の最後に自動的に呼び出されます。
- パラメーターを受け入れず、オーバーロードすることもできません。
デストラクターはどのように機能しますか?
オブジェクトが作成されると、ヒープ内のスペースを占有します。これらのオブジェクトはスレッドによって使用されます。オブジェクトがスレッドによって使用されなくなった場合、そのオブジェクトはガベージ コレクションの対象になります。そのオブジェクトによって占有されていたメモリは、作成中の新しいオブジェクトで使用できるようになります。ガベージ コレクターがオブジェクトを破棄すると、JRE は Finalize() メソッドを呼び出してデータベースやネットワーク接続などの接続を閉じることに注意してください。
上記のことから、デストラクターとガベージ コレクターの使用は、開発者がメモリ管理に干渉するレベルであると結論付けることができます。それが 2 つの主な違いです。デストラクターは、オブジェクトがいつ破棄されるかを正確に通知します。 Java では、ガベージ コレクターが同じ作業を自動的に実行します。メモリ管理に対するこれら 2 つのアプローチには、プラスの効果とマイナスの効果があります。しかし、主な問題は、開発者がメモリ管理に即座にアクセスする必要がある場合があるということです。
Javaのfinalize()メソッド
プログラマがガベージコレクタを強制的に実行してオブジェクトを破壊することは困難です。しかし、Java は同じことを行う別の方法を提供します。 Java オブジェクト クラスは以下を提供します。 ファイナライズ() デストラクターと同じように機能するメソッド。 Finalize() メソッドの構文は次のとおりです。
構文:
protected void finalize throws Throwable() { //resources to be close }
これはデストラクターではありませんが、追加のセキュリティを提供します。プログラムをシャットダウンする前に、ファイルを閉じるなどの外部リソースが確実に使用されるようにします。メソッド自体を使用するか、メソッドを呼び出すことで呼び出すことができます。 System.runFinalizersOnExit(true) 。
- これは、java.lang パッケージで定義されている Object クラスの保護されたメソッドです。
- 呼び出すことができるのは 1 回だけです。
- メソッドをオーバーライドしたい場合は、finalize() メソッドを明示的に呼び出す必要があります。
- gc() は、ガベージ コレクターによって実行される JVM のメソッドです。ヒープ メモリがいっぱいで、新しく到着するオブジェクトのためにさらに多くのメモリが必要な場合に呼び出されます。
- 未チェックの例外を除き、JVM は Finalize() メソッドによって発生するすべての例外を無視します。
デストラクタの例
デストラクターの例.java
public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } }
出力:
Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector