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?
Réponses
Trop de publicités?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
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é?)
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);
}
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.