53 votes

Est-ce que variable = null la définit pour le garbage collection?

Aidez-moi à régler un différend avec un collègue: la définition d'une variable ou d'une collection sur null dans Java facilite-t-elle la récupération de place et réduit-elle l'utilisation de la mémoire? Si j'ai un programme long et que chaque fonction peut être appelée de manière itérative (potentiellement des milliers de fois): Est-ce que définir toutes les variables qu'il contient sur null avant de renvoyer une valeur à la fonction parent aide à réduire la taille de mémoire / l'utilisation de la mémoire?

60voto

sblundy Points 27163

C'est la vieille tradition de performance. C'était vrai en 1.0 jours, mais le compilateur et la JVM ont été améliorés pour éliminer le besoin (si jamais il en existait). Cet excellent article d'IBM entre dans les détails si vous êtes intéressé: Théorie et pratique de Java: Collecte de place et performances

7voto

Pete Points 2216

De l'article:

Il existe un cas où l'utilisation explicite de la micropression n'est pas seulement utile, mais pratiquement nécessaire, et c'est là une référence à un objet qui a une étendue plus large que la il est utilisé ou considéré comme valide par le programme de la spécification. C'est le cas par exemple en utilisant une statique de l'instance ou de champ pour stocker une référence à une mémoire tampon temporaire, plutôt que d'une variable locale, ou l'utilisation d'un tableau pour stocker les références qui restent accessibles par le moteur d'exécution, mais pas par l'implicite de la sémantique du programme.

Traduction: "explicitement null" objets persistants, qui ne sont plus nécessaires. (Si vous le souhaitez. "La quasi-requis" trop forte d'un énoncé?)

5voto

Pete Kirkham Points 32484

La machine virtuelle Java Spec

12.6.1 La Mise En Œuvre De Finalisation Chaque objet peut être caractérisé par deux caractéristiques: elle peut être accessible, finaliseur-accessible ou inaccessible, et il peut également être non, finalisable, ou de finalisation.

Un accessible de l'objet est un objet qui peut être consulté en toute éventuelle poursuite de calcul à partir de n'importe quel thread. L'optimisation des transformations d'un programme peut être conçu de manière à réduire le nombre d'objets qui sont accessibles à moins que celles qui auraient naïvement être considéré joignable. Par exemple, un compilateur ou d'un générateur de code peut choisir de définir une variable ou un paramètre qui n'est plus utilisé pour des nuls à cause du stockage pour un tel objet potentiellement récupérable plus tôt.

Discussion

Un autre exemple de cette situation se produit si les valeurs dans un objet les champs sont stockés dans les registres. Le programme peut alors avoir accès aux registres à la place de l'objet, et de ne jamais accéder à l'objet nouveau. Cela impliquerait que l'objet est des ordures.

L'objet est accessible s'il peut être impliqué dans un quelconque potentiel de continuer le calcul. Donc, si votre code fait référence à une variable locale, et rien d'autre se réfère à elle, alors vous pourriez causer la collecte de l'objet par la valeur null. Ce serait donner une exception de pointeur null, ou de modifier le comportement de votre programme, ou si elle n'est ni vous n'avez pas besoin de la variable dans la première place.

Si vous êtes invalide un terrain ou un élément de tableau, alors que peut éventuellement faire sens pour certaines applications, et il sera la cause de la mémoire pour être récupéré plus vite. Une fois que le cas est de créer un grand tableau à remplacer un existant tableau référencé par un champ dans une classe - si le champ dans annulées avant le remplacement est créé, il peut soulager la pression sur la mémoire.

Une autre caractéristique intéressante de Java est que la portée n'apparaît pas dans les fichiers de classe, de sorte que la portée n'est pas pertinent pour l'accessibilité; ces deux méthodes permettent de créer le même bytecode, et donc la VM ne voit pas la portée de l'objet créé à tous:

static void withBlock () {
    int x = 1;

    {
        Object a = new Object();
    }

    System.out.println(x+1);
}

static void withoutBlock () {
    int x = 1;

    Object a = new Object();

    System.out.println(x+1);
}

3voto

Jesper Points 65733

Pas nécessairement. Un objet devient admissible pour la collecte des ordures quand il y a pas de fils plus que contenir une référence à l'objet.

Les variables locales hors de portée lorsque la méthode retourne et il n'a aucun sens pour définir des variables locales à null - les variables disparaître de toute façon, et si il n'y a rien d'autre qui contient une référence les objets qui les variables visées, ces objets deviennent admissibles pour la collecte des ordures.

La clé est de ne pas regarder seulement les variables, mais regardez les objets que ces variables se rapportent à, et de trouver où ces objets sont référencés par votre programme.

2voto

Skeptic Points 915

C'est inutile sur les variables locales, mais cela peut être utile / nécessaire pour clarifier les variables d'instance qui ne sont plus nécessaires (par exemple, une post-initialisation).

(Ouais ouais, je sais comment appliquer le motif Builder ...)

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