Vous ne spécifiez pas la portée de myObj
et son importance. Si c'est une variable locale, cela n'a certainement pas d'importance. Si la variable d'instance alors que pourrait être une référence à long terme et inutile dans ce cas, la mise à null
sera utile.
Update: compte tenu des informations mises à jour que myObj
est local à la méthode, il sera d'une valeur nulle pour le mettre à null
à la fin de chaque itération de la boucle. Considérez cet exemple:
public void process(String text) {
String[] lines = text.split("\n");
List<MyObject> list = new ArrayList<MyObject>();
Object myObj;
for (String line : lines) {
myObj = new MyObject(line);
list.add(myObj);
// 1. set myObj = null here
}
list = null; // 2
// 3. do some other stuff
}
public class MyObject {
private final String line;
public MyObject(String line) {
this.line = line;
}
}
maintenant dans cet exemple, disons que à l'étape 3, il a fallu longtemps. Dites 10 minutes. Pendant ces 10 minutes myObj
pointe vers la dernière ligne traitée. Ça ne ressemble pas à un problème? Eh bien, ça pourrait l'être. La façon dont les sous-chaînes fonctionnent en Java est qu'elles font référence à la chaîne d'origine. Donc, si vous faites:
String s = ... // 100 megabytes
String s2 = s.substring(100, 101);
vous gardez en fait 100 Mo dans la mémoire car s2 fait référence à s.
Ainsi, dans la fonction que j'ai ci-dessus, les références myObj
une ligne qui fait référence à l'ensemble du dossier. Changer l'étape 1 à myObj = null;
aiderait réellement parce que cette référence empêche l'objet d'être collecté.
Remarque: l'étape 2 est importante ici car si vous n'aviez pas annulé la liste, toutes les références existeraient de toute façon.
Vous avez juste besoin de réfléchir sur la façon dont fonctionnent les références. Un objet ne sera pas collecté alors qu'il existe une référence à celui-ci. Cela signifie effacer les références de longue durée et conserver des variables aussi précises que possible.La bonne solution pour ce qui précède est:
for (String line : lines) {
Object myObj = new MyObject(line);
...
}
puis myObj
est SCOPED dans la boucle dès que la boucle se termine ou commence une autre itération, il est passé hors de portée, ce qui est beaucoup mieux. Parce qu'il est dans un while
, myObj
est toujours écrasé (la référence)
Dans ce cas, il ne semble pas que myObj ait jamais une récupération de place tant qu'arList ne sera plus utilisé. –
hmm .. mais je ne souhaite pas conserver 2 copies de myObj, une dans arList et une dans la variable d'origine. Comment puis-je vider myObj une fois que je l'ai ajouté à arLsit? –
Il n'y a qu'une seule copie de 'myObj', mais il y a deux * références *. En interne, c'est la même chose que d'avoir un objet et deux pointeurs. –