ホームページ  >  記事  >  Java  >  Javaのfinalizeメソッドの機能は何ですか

Javaのfinalizeメソッドの機能は何ですか

hzc
hzcオリジナル
2020-07-03 15:34:344634ブラウズ

Java の Finalize メソッドは、Object クラスで提供されるメソッドであり、GC がオブジェクトによって占有されているメモリ領域を解放する準備ができる前に、最初に Finalize() メソッドを呼び出します。

Javaのfinalizeメソッドの機能は何ですか

finalize() メソッドは、Object クラスで提供されるメソッドです。GC がオブジェクトによって占有されているメモリ領域を解放する準備ができる前に、最初にFinalize() メソッドを呼び出します。 Object では次のように定義されています。

protected void finalize() throws Throwable { }

1 Finalize() 呼び出しのタイミング

は、次のようにデストラクタに関係します。 C (オブジェクト (クリアする前にデストラクタが呼び出されます)。Java では、GC の自動リサイクル機構により、finalize メソッドが時間内に実行されるという保証はありません (ガベージ オブジェクトのリサイクルのタイミングは不確実です)。それらは保証されますか? が実行されます (プログラムは最初から最後までガベージ コレクションをトリガーしません)。

public class Finalizer {
	@Override
	protected void finalize() throws Throwable {
		System.out.println("Finalizer-->finalize()");
	}

	public static void main(String[] args) {
		Finalizer f = new Finalizer();
		f = null;
	}
}
//无输出
public class Finalizer {

	@Override
	protected void finalize() throws Throwable {
		System.out.println("Finalizer-->finalize()");
	}

	public static void main(String[] args) {
		Finalizer f = new Finalizer();
		f = null;
		
		System.gc();//手动请求gc
	}
}
//输出 Finalizer-->finalize()

2 いつ使用するか

finalize() メソッドは通常、リリースに使用されます。非リソース (オープン ファイル リソース、データベース接続など)、または非 Java メソッド (ネイティブ メソッド) (C 言語の malloc() シリーズ関数など) を呼び出すときに割り当てられるメモリ。

3 使用を避けるべき理由

まず第一に、finalize() メソッドを呼び出すタイミングが不確実であるため、オブジェクトから に変わります。 到達不能になってから Finalize() メソッドが実行されるまでにかかる時間は任意に長くなります。占有されているリソースをタイムリーにリサイクルするために、finalize() メソッドに依存することはできません。リソースを使い果たす前に gc がトリガーされていないという状況が考えられます。そのため、通常のアプローチは、明示的に close() メソッドを提供することです。クライアントが手動で転送するため。
さらに、finalize() メソッドをオーバーライドすると、オブジェクトをリサイクルするときにさらに多くの操作が必要になり、オブジェクトのリサイクルにかかる時間が長くなります。

4 オブジェクトを再度存続させる

finalize() メソッドが最大 1 回しか呼び出されないという機能を利用して、オブジェクトのライフサイクルを延長できます。 。

class User{
	
	public static User user = null;

	@Override
	protected void finalize() throws Throwable {
		System.out.println("User-->finalize()");
		user = this;
	}
	
}

public class FinalizerTest {
	public static void main(String[] args) throws InterruptedException {
		User user = new User();
		user = null;
		System.gc();
		Thread.sleep(1000);
		
		user = User.user;
		System.out.println(user != null);//true
		
		user = null;
		System.gc();
		Thread.sleep(1000);
		System.out.println(user != null);//false
	}
}

推奨チュートリアル: "java チュートリアル"

以上がJavaのfinalizeメソッドの機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。