Des questions de ce genre semblent être très populaires lors de l'enseignement de Java aux débutants, mais sont complètement absurdes. Alors qu'un answer like this est génial pour faire, celui qui a inventé cette question, heureux, ce n'est pas correct quand creuser plus profond:
Les références aux objets contenus dans les variables locales n'empêchent pas les objets d'être collectés. Si le code suivant ne les touche pas, ces objets peuvent toujours être considérés comme inaccessibles, ce qui n'est pas un problème théorique. Comme démontré dans “finalize() called on strongly reachable object in Java 8”, même l'exécution en cours d'une méthode de cet objet n'entrave pas sa collecte, si l'instance n'est pas touchée par la suite. Comme dans votre exemple de code, les objets ne contiennent aucune donnée, il est évident qu'ils ne sont jamais touchés, ce qui implique qu'ils peuvent être collectés à tout moment, en fonction de l'état d'optimisation de la JVM. Le code peut également être optimisé à un degré tel qu'il n'effectue que l'effet secondaire visible des deux instructions d'impression, c'est-à-dire que les objets ne sont jamais créés du tout.
Ceci est soutenu par The Java® Language Specification, § 12.6.1. Implementing Finalization:
transformations Optimisation d'un programme peut être conçu pour réduire le nombre d'objets qui sont accessibles à moins de celles qui seraient considérés comme accessibles naïvement être. Par exemple, un compilateur Java ou un générateur de code peut choisir de définir une variable ou un paramètre qui ne sera plus utilisé pour null
pour que le stockage d'un tel objet soit potentiellement récupérable plus tôt.
Un autre exemple de ceci se produit si les valeurs dans les champs d'un objet sont stockées dans des registres. Le programme peut alors accéder aux registres à la place de l'objet et ne plus jamais accéder à l'objet. Cela impliquerait que l'objet est garbage....
Pratiquement, puisque c'est trivial code court-courant à l'intérieur d'une méthode main
, le scénario le plus courant serait que le code fonctionne unoptimized, mais pas de collecte des ordures ne se fera jamais dans ce court laps de temps d'exécution.
Ceci conduit à l'autre raison pour laquelle poser de telles questions n'a aucun sens. Il peut être difficile de trouver les bons points quand un objet est naïvement considéré comme inaccessible, il sera impossible de deviner quand et comment l'optimiseur influence le résultat, mais le but entier de la collecte des ordures est que le développeur n'a pas à s'inquiéter à ce sujet.
Maintenant que je connais ** un peu de ** Java, votre point semble intéressant. – jiltedpotato