88 votes

L'affectation d'objets à null dans Java a-t-elle un impact sur la récupération de place?

L'affectation d'un objet inutilisé à null en Java améliore-t-elle le processus de récupération de place de manière mesurable?

Mon expérience avec Java (et C #) m’a appris que c’était souvent contre-intuitif d’essayer de déjouer la machine virtuelle ou le compilateur JIT, mais j’ai vu des collègues utiliser cette méthode et je suis curieux de savoir si c’est une bonne pratique ou l'une de ces superstitions de programmation vaudou?

67voto

Mark Renouf Points 13128

Habituellement, non.

Mais comme toutes les choses: ça dépend. Le GC en Java, ces jours-ci est TRÈS bon et tout ce qui doit être nettoyé très peu de temps après il n'est plus accessible. C'est juste après avoir quitté une méthode pour les variables locales, et quand une instance de classe n'est plus référencé pour les champs.

Vous ne devez explicitement la valeur null si vous savez qu'il resterait référencé autrement. Par exemple, un tableau qui est maintenu autour de. Vous souhaitez peut-être à null les différents éléments de la matrice quand ils ne sont plus nécessaires.

Par exemple, ce code de liste de tableaux:

public E remove(int index) {
    RangeCheck(index);

    modCount++;
    E oldValue = (E) elementData[index];

    int numMoved = size - index - 1;
    if (numMoved > 0)
         System.arraycopy(elementData, index+1, elementData, index,
		     numMoved);
    elementData[--size] = null; // Let gc do its work

    return oldValue;
}

Aussi, explicitement micropression un objet ne sera pas provoquer un objet à être pris plus tôt que si elle vient de sortir de la portée naturellement aussi longtemps que l'absence de références restent.

À la fois:

void foo() {
   Object o = new Object();
   /// do stuff with o
}

et:

void foo() {
   Object o = new Object();
   /// do stuff with o
   o = null;
}

Sont fonctionnellement équivalents.

12voto

Gili Points 14674

Dans mon expérience, le plus souvent, les gens null références de la paranoïa non pas par nécessité. Voici un rapide guide:

  1. Si l'objet A fait référence à l'objet B et vous n'avez plus besoin de cette référence et l'objet A n'est pas admissible pour la collecte des ordures alors vous devez explicitement nulle sur le terrain. Il n'est pas nécessaire de nulle un champ si l'affichage de l'objet est d'obtenir des ordures de toute façon. Micropression les champs dans une méthode dispose() est presque toujours inutile.

  2. Il n'est pas nécessaire à null hors les références de l'objet créé dans une méthode. Ils le seront automatiquement effacées une fois que la méthode se termine. L'exception à cette règle est si vous êtes en cours d'exécution dans une très longue méthode ou de certains massifs de la boucle et vous devez vous assurer que certaines références se purifient avant la fin de la méthode. Encore une fois, ces cas sont extrêmement soin.

Je dirais que la grande majorité du temps, vous n'aurez pas besoin de null références. Tente de déjouer le garbage collector est inutile. Vous finirez juste inefficace, illisible code.

8voto

Charlie Martin Points 62306

Au moins en java, il n'est pas le vaudou programmation. Lorsque vous créez un objet en java en utilisant quelque chose comme

Foo bar = new Foo();

vous faites deux choses: tout d'abord, vous créez une référence à un objet, et la deuxième, vous créez l'objet Foo lui-même. Tant que référence ou de l'autre, l'objet spécifique ne peut pas être gc. toutefois, lorsque vous affectez la valeur null pour que la référence...

bar = null ;

et en supposant que rien d'autre n'a une référence à l'objet, il est libéré et disponible pour le gc, la prochaine fois que le garbage collector de passe.

7voto

Définir explicitement une référence à null au lieu de laisser la variable hors de portée, n'aide pas le garbage collector, sauf si l'objet est grand, où le paramètre null dès que vous avez terminé avec est une bonne idée.

Généralement, la définition des références à null, le LECTEUR de code que cet objet est complètement terminé, et ne devrait pas inquiéter plus.

Un effet similaire peut être obtenu avec en les mettant dans un ensemble supplémentaire de croisillons

{
  int l;
  {
    String bigThing = ....;
    l = bigThing.length();
  }
  ---
}

cela permet à l'bigThing être nettoyée à droite après avoir quitté les accolades imbriquées.

7voto

lubos hasko Points 13669

Il dépend.

En général plus court que vous gardez les références à vos objets, plus vite ils vont obtenir recueillies.

Si votre méthode prend dire 2 secondes à s'exécuter et vous n'avez pas besoin d'un objet plus après une seconde de l'exécution de la méthode, il est logique pour effacer toutes les références. Si GC voit qu'après une seconde, l'objet est encore référencée, la prochaine fois, il pourrait vérifier qu'une minute.

De toute façon, le réglage de toutes les références à null par défaut est pour moi l'optimisation prématurée, et personne ne doit le faire, sauf dans les rares cas où il, de façon mesurable, diminue la mémoire consuption.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X