Maison  >  Questions et réponses  >  le corps du texte

Garbage Collection - Comment collecter manuellement des objets en Java

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=nullNe dites pas simplement que new1=null se porte bien

为情所困为情所困2712 Il y a quelques jours1015

répondre à tous(5)je répondrai

  • 迷茫

    迷茫2017-05-17 10:07:31

    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.

        WeakReference<Data> new1 = new WeakReference(data);
        Data new2 = data;
        new2 = null;
        data = null;
        System.gc();//告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 ,所以下面延迟2秒
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(new1.get().num);

    répondre
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-17 10:07:31

    System.gc();

    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.

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-17 10:07:31

    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

        {
            OutClass outClass1 = new OutClass();
            OutClass outClass2 = new OutClass();
            outClass2.outClass = outClass1;
            outClass1 = null;
            System.out.print(outClass1);
        }
        
        class OutClass {
            public OutClass outClass;
        }

    répondre
    0
  • ringa_lee

    ringa_lee2017-05-17 10:07:31

    Avant de comprendre les principes de JMM, n'utilisez jamais System.gc() sans discernement, juste obj=null lorsque l'objet est épuisé.

    répondre
    0
  • 滿天的星座

    滿天的星座2017-05-17 10:07:31

    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.

    répondre
    0
  • Annulerrépondre