37 votes

Quelles sont certaines Java mémoire des meilleures pratiques de gestion?

Je prends le contrôle de certaines applications à partir d'un développeur précédent. Quand je lance les applications via Eclipse, je vois l'utilisation de la mémoire et de la taille de segment de mémoire augmente beaucoup. Après enquête, je vois qu'ils ont été la création d'un objet au cours et plus dans une boucle ainsi que d'autres choses.

J'ai commencé à aller à travers et faire un peu de nettoyage. Mais plus je suis passé par la, la plus de questions, j'ai eu comme "ce sera effectivement faire quelque chose?"

Par exemple, au lieu de déclarer une variable en dehors de la boucle mentionnée ci-dessus et juste définition de sa valeur dans la boucle... ils ont créé l'objet dans la boucle. Ce que je veux dire, c'est:

for(int i=0; i < arrayOfStuff.size(); i++) {
    String something = (String) arrayOfStuff.get(i);
    ...
}

rapport

String something = null;
for(int i=0; i < arrayOfStuff.size(); i++) {
    something = (String) arrayOfStuff.get(i);
}

Suis-je inexact de dire que la boucle du bas est le meilleur? Peut-être que je me trompe.

Aussi, qu'après la deuxième boucle ci-dessus, j'ai mis "quelque chose" null? Serait-effacer la mémoire?

Dans les deux cas, ce sont certains de la bonne gestion de la mémoire meilleures pratiques j'ai pu suivre qui vous aidera à garder mon utilisation de la mémoire faible dans mes applications?

Mise à jour:

J'apprécie tous les commentaires jusqu'à présent. Cependant, je n'étais pas vraiment se poser sur le dessus de boucles (bien que par vos conseils, j'ai fait revenir à la première boucle). Je suis en train d'essayer d'obtenir quelques bonnes pratiques que je peux garder un œil sur. Quelque chose sur les lignes de "lorsque vous avez terminé d'utiliser une Collection, de l'annuler". J'ai vraiment besoin de s'assurer de ne pas autant de mémoire est en train d'être prises par ces applications.

37voto

cherouvim Points 18550

Ne pas essayer de déjouer la VM. La première boucle est suggéré de meilleures pratiques, à la fois pour la performance et la facilité de maintenance. Réglage de la référence à null après la boucle ne sera pas garantie immédiate libérer de la mémoire. Le GC va faire de son mieux, lorsque vous utilisez la portée minimale possible.

Les livres qui couvrent ces choses dans le détail (à partir de la perspective de l'utilisateur) sont Efficaces Java 2 et la mise en Œuvre des Schémas.

Si vous vous souciez de pour en savoir plus sur les performances et les ampoules de la machine virtuelle, vous devez voir le discours ou la lecture de livres de Brian Goetz.

9voto

Michael Myers Points 82361

Ces deux boucles sont équivalents, sauf pour le champ d'application de l' something; voir à cette question pour plus de détails.

Les meilleures pratiques en la matière? Euh, voyons voir: ne pas stocker de grandes quantités de données dans des variables statiques, sauf si vous avez une bonne raison. Enlever les grands objets de collections, quand vous en avez terminé avec eux. Et oh oui, "la Mesure, ne pas le deviner." Utiliser un profiler pour voir où la mémoire est allouée.

8voto

Kees de Kooter Points 3268

Il n'y a pas les objets créés dans les deux exemples de code. Il vous suffit simplement de définir une référence d'objet à une chaîne de caractères qui est déjà dans le arrayOfStuff. Donc memorywise il n'y a pas de différence.

5voto

La JVM est préférable à "libérer" des objets éphémères. Essayez de ne pas allouer des objets que vous n'avez pas besoin. Mais vous ne pouvez pas optimiser l'utilisation de la mémoire jusqu'à ce que vous comprenez de votre charge de travail, la durée de vie des objets, et l'objet de tailles. Un profileur peut vous dire ceci.

Enfin, le n ° 1 chose que vous devez éviter de faire: ne jamais utiliser des outils de finalisation. Les finaliseurs interférer avec la collecte des ordures, puisque l'objet ne peut pas être tout juste libérée, mais doit être mis en file d'attente de finalisation, ce qui peut ou peut ne pas se produire. Il est préférable de ne jamais utiliser des outils de finalisation.

Comme pour l'utilisation de la mémoire que vous avez vu dans Eclipse, il n'est pas nécessairement pertinent. Le GC va faire son travail basée sur la quantité de mémoire libre, il est. Si vous avez beaucoup de mémoire libre, vous ne pourriez pas voir d'un seul GC avant que l'application est à l'arrêt. Si vous trouvez que votre application en cours d'exécution hors de la mémoire alors que d'un véritable générateur de profils peux vous dire où il y a des fuites ou des dysfonctionnements sont.

4voto

Horcrux7 Points 8369

La première boucle est mieux. Parce que

  • la variable quelque chose sera claire, plus rapide (théorique)
  • le programme est préférable de lire.

Mais du point de mémoire ce n'est pas pertinent.

Si vous avez des problèmes de mémoire, alors vous devriez profil, où il est consommé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: