Commençons par le code. Mon objectif est de faire disparaître complètement les données
.public class Test {
public static void main(String[] args) {
Data data = new Data();
data.num = 10;
Data new1 = data;
Data new2 = data;
new2 = null;
data = null;
System.out.println(new1.num);
}
}
class Data {
int num;
}
Je connais le mécanisme de récupération de place de Java. Tant que quelque chose y fait toujours référence, il ne disparaîtra pas. Le code ci-dessus peut toujours afficher 10 normalement.
Mais je veux savoir comment créer System.out .println(new1. .num);
renvoie une exception null
, ce qui signifie qu'il n'existe aucune donnée de ce typeSystem.out.println(new1.num);
抛出null
异常,即彻底没有这个数据
不要说让new1=null
Ne dites pas simplement que new1=null
se porte bien
Vous l'avez dit vous-même : "Je connais le mécanisme de récupération de place de Java. Tant que quelque chose y fait référence, il ne disparaîtra pas." La variable "new1" fait toujours référence à la mémoire de "new Data()" dans le tas. , comment pourrait-il être recyclé, afin que le code que nous écrivons ne soit pas uniquement constitué d'exceptions de pointeur nul. Vous pouvez utiliser WeakReference au lieu d'une référence forte.
Il est recommandé que la JVM exécute gc, qui peut être complètement rejetée. Le GC lui-même s'exécutera automatiquement périodiquement et la JVM déterminera le moment de l'exécution. De plus, la version actuelle propose une variété de modes plus intelligents et effectuera automatiquement des sélections en fonction de la machine sur laquelle elle s'exécute, même si elle existe. sont en effet des améliorations de performances. Si nécessaire, vous devez également affiner le mécanisme de fonctionnement du GC au lieu d'optimiser les performances en utilisant cette commande.
Les objets qui ont des références d'objet et sont sur le point d'être supprimés peuvent toujours être définis sur null
Avant de comprendre les principes de JMM, n'utilisez jamais System.gc() sans discernement, juste obj=null lorsque l'objet est épuisé.
La réponse est non. Il s'agit d'un comportement non défini dans la spécification JVM. Les développeurs ne doivent pas essayer d'aider manuellement la machine virtuelle à recycler un objet. S'il s'agit du JDK de Sun, il semble y avoir un package dangereux, mais je ne l'ai jamais utilisé et je ne sais pas s'il existe une telle API.