Maison  >  Article  >  Java  >  Quelle est la fonction de la méthode finalize en Java

Quelle est la fonction de la méthode finalize en Java

hzc
hzcoriginal
2020-07-03 15:34:344553parcourir

La méthode finalize en Java est une méthode fournie dans la classe Object. Avant que le GC ne soit prêt à libérer l'espace mémoire occupé par l'objet, il appellera d'abord la méthode finalize().

Quelle est la fonction de la méthode finalize en Java

La méthode finalize() est une méthode fournie dans la classe Object avant que le GC ne soit prêt à libérer l'espace mémoire occupé par l'objet, il le fera d'abord. appelez la méthode finalize(). Il est défini dans Object comme suit :

protected void finalize() throws Throwable { }

1 Le timing de l'appel finalize()

et le destructeur de C++ ( objet (Le destructeur sera appelé avant l'effacement). En Java, en raison du mécanisme de recyclage automatique de GC, il n'y a aucune garantie que la méthode finalize sera exécutée à temps (le moment du recyclage des objets indésirables est incertain), et ils ne le peuvent pas non plus. sera garanti. sera exécuté (le programme ne déclenche pas le garbage collection du début à la fin).

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 Quand faut-il l'utiliser

La méthode finalize() est généralement utilisée pour libérer des ressources non Java (telles que des ressources de fichiers ouverts, des connexions à une base de données, etc.) ou de la mémoire allouée lors de l'appel de méthodes non Java (méthodes natives) (telles que les fonctions de la série malloc() du langage C).

3 Pourquoi vous devriez éviter de l'utiliser

Tout d'abord, en raison de l'incertitude quant au moment d'appeler la méthode finalize(), d'un objet à Le temps qu'il faut entre le début de l'inaccessibilité et l'exécution de la méthode finalize() est arbitrairement long. Nous ne pouvons pas compter sur la méthode finalize() pour recycler les ressources occupées en temps opportun. La situation possible est que le gc n'a pas été déclenché avant d'épuiser les ressources. Par conséquent, l'approche habituelle consiste à fournir une méthode close() explicite. pour que le client appelle manuellement.
De plus, remplacer la méthode finalize() signifie que davantage d'opérations sont nécessaires lors du recyclage des objets, prolongeant ainsi le temps de recyclage des objets.

4 Laissez l'objet vivre à nouveau

Grâce à la fonctionnalité selon laquelle la méthode finalize() ne sera appelée qu'une seule fois au maximum, nous pouvons prolonger le cycle de vie de l'objet .

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
	}
}

Tutoriel recommandé : "tutoriel Java"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn