En effet : parce que la taille du tableau est d'environ 4 Mo. Donc le GC est obligé d'allouer plus de mémoire que les 2Mo initiales. Et comme il s'agit d'objet temporaire il prefèrera libérer la mémoire plutôt que d'en allouer encore.
Donc il supprime réellement le tableau précédent à chaque itération : on se retrouve dans le même cas de figure qu'une gestion manuelle de la mémoire...
Il serait ici préférable d'augmenter le heap pour limiter le nombre de libération...
Cela déresponsabilise un peu les développeurs... peut-être...
Mais que ce soit avec un GC ou sans, dans une "grosse" application on est obligé de prendre en compte la mémoire...
Les majors collections sont en effet coûteuse, mais on peut améliorer cela en modifiant les tailles min/max du heap, ou en utilisant un GC concurent...
Et si cela se produit trop souvent, c'est également que l'application consomme beaucoup de mémoire. Le fait qu'elle soit géré manuellement ne résoudra pas forcément le problème.
Une option no-gc je ne pense pas que ce soit possible (en Java), étnt donné que le langage est basé sur l'utilisation du GC...
Mais un mot clef permettant de libérer manuellement un objet (s'il n'y a plus d'autres références vers celui-ci), c'est vrai que cela pourrait être utile, du style :
1 2 3 4
| Object o = new Object();
...
o = null-gc;
// o vaut null et le GC tentera de le libérer |
Mais bon c'est quand même assez limité je trouve...
a++
Partager