Je travaille actuellement sur l'optimisation de mon application et j'ai remarqué qu'elle prend près de 1 Go de RAM. J'ai fait du profilage et trouvé le problème: J'allouais beaucoup de mémoire en créant des tableaux int contenant des données de pixels dans une classe de texture que j'avais créée. Mais cela m'embrouille, car lors de la création d'un nouveau tableau, l'ancien tableau n'est plus utilisé et il n'y a aucune référence.Java - les tableaux non référencés prennent encore de la mémoire
J'ai écrit un programme de test qui reproduit ce problème:
public class Main {
static class ArrayHolder {
int[] array;
void init() {
array = null;
array = new int[4000];
}
}
public static void main(String[] args) {
ArrayHolder holder = new ArrayHolder();
for (int i = 0; i < 1000000; i++) {
holder.init();
}
System.out.println(holder.array.length);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Quand je lance ce code, le programme utilise jusqu'à 600 Mo de RAM. Je ne comprends pas pourquoi, car lorsque vous appelez la méthode init() dans ArrayHolder, le champ de tableau est défini sur le nouveau tableau et la référence à l'ancien est perdue. Cela ne veut-il pas dire qu'il ne prend plus de place? Je suis désolé si c'est une question noobish mais quelqu'un peut-il expliquer pourquoi c'est et ce que je fais mal ici?
Votre ancien tableau ne sera lancé qu'à la discrétion de gc. Si gc s'exécute peu de temps après que vous ayez réalloué de la mémoire, l'espace sera récupéré autrement. – SMA
de grands tableaux sont ajoutés à l'espace réservé et ce n'est que GC-ed par défaut quand il se remplit. par exemple. le sommeil ne déclenche pas de GC. En bref, créer beaucoup de grands tableaux comme celui-ci est mauvais idéal pour de nombreuses raisons. –