Comprendre la gestion de la mémoire Java
Programmeurs Java sais que la JVM exécute un Garbage Collector, et du Système.gc() serait juste une suggestion pour la JVM pour exécuter un Garbage Collector. Il n'est pas nécessairement que si nous utilisons Système.gc(), il serait exécuté immédiatement la GC.
Veuillez me corriger si j'ai mal compris Java du Garbage Collector.
Est/sont-il un autre moyen/s à faire la gestion de la mémoire autres que de compter sur Java du Garbage Collector?
Si vous avez l'intention de répondre à la question par une sorte de programmation pratique qui permettrait d'aider à la gestion de la mémoire, merci de le faire.
source d'informationauteur Michael Ardan | 2012-12-13
Vous devez vous connecter pour publier un commentaire.
La chose la plus importante à retenir à propos de Java, gestion de la mémoire est "annuler" votre référence.
Uniquement les objets qui ne sont pas référencées sont à ordures.
Par exemple, les objets dans le code suivant n'est jamais obtenir recueillies et votre mémoire sera pleine, juste pour ne rien faire.
Mais si vous n'avez pas de référence à ceux de l'objet ... vous pouvez faire une boucle comme beaucoup que vous le souhaitez sans problème de mémoire.
Alors ce que jamais vous le faites, assurez-vous de supprimer la référence d'objet n'est plus utilisé (référence à
null
ou clair de la collection).Lorsque le garbage collector course est préférable de laisser à la JVM de décider. Eh bien, à moins que votre programme est sur le point de commencer à faire des choses qui utilisent beaucoup de mémoire et la vitesse critique de sorte que vous peut suggérer JVM pour exécuter GC avant d'aller dans comme vous pouvez probablement obtenir le garbaged recueillies et de la mémoire supplémentaire pour aller sur. Autres sage, personnellement, je ne vois pas de raison pour exécuter
System.gc()
.Espérons que cette aide.
Ci-dessous est petit résumé que j'ai écrit à l'époque (je l'ai volé à partir de certains blog, mais je ne me souviens pas d'où - donc pas de référence, désolé)
-Xms
et-Xmx
est utilisé pour la configuration de départ et la taille max pour Java Heap. Le ratio idéal de ce paramètre est 1:1 ou de 1:1,5, basé sur mon expérience, par exemple, vous pouvez avoir à la fois–Xmx
et–Xms
comme 1 go ou –Xms 1.2 go et 1,8 GO.Options de ligne de commande:
-Xms:<min size> -Xmx:<max size>
Juste pour ajouter à la discussion: la Collecte des Ordures n'est pas la seule forme de Gestion de la Mémoire en Java.
Dans le passé, il y a eu des efforts pour éviter la GC en Java lors de la mise en œuvre de la gestion de la mémoire (voir Real-time Specification for Java (RTSJ)). Ces efforts ont été essentiellement consacrées à temps réel et embarqués programmation en Java pour les GC n'était pas adapté - en raison de la surcharge de performances ou GC-introduit la latence.
La RTSJ caractéristiques
RTSJ avantages:
Pourquoi RTSJ d'échec/de ne pas avoir un gros impact:
L'étendue de la Mémoire Exemple de Code (prendre de Un Exemple de l'Étendue de l'Utilisation de la Mémoire):
Ici, un ScopedMemory mise en œuvre appelée
LTMemory
est préaffectés. Puis un fil entre l'étendue de la mémoire, alloue les données temporaires qui sont uniquement nécessaires pendant le temps de calcul. Après la fin du calcul, le fil feuilles de l'étendue de la mémoire qui fait immédiatement l'ensemble du contenu des ScopedMemory être vidé. Pas de temps de latence introduit, fait en temps constant par exemple, prévisible, pas de GC est déclenchée.De mon expérience, en java, vous devez compter sur la gestion de la mémoire qui est fourni par la JVM elle-même.
Le point que j'avais l'accent sur dans cette rubrique est de le configurer d'une manière acceptable pour votre cas d'utilisation. Peut-être que la vérification/compréhension de la JVM options de paramétrage serait utile: http://docs.oracle.com/cd/E15523_01/web.1111/e13814/jvm_tuning.htm
Vous ne pouvez pas éviter la collecte des ordures si vous utilisez Java. Peut-être il ya quelque obscure de la JVM des implémentations qui le font, mais je ne sais pas du tout.
Correctement à l'écoute de la JVM ne devrait pas exiger n'importe quel Système.gc() conseils pour bien fonctionner. Le réglage exact que vous auriez besoin dépend fortement de ce que votre application n', mais dans mon expérience, j'ai toujours tourner sur les concurrent-mark-and-sweep option avec l'option suivante:
-XX:+UseConcMarkSweepGC
. Cet indicateur permet à la JVM pour profiter du supplément de cœurs de votre PROCESSEUR pour nettoyer une mémoire morte sur un thread d'arrière-plan. Il permet de réduire considérablement la quantité de temps que votre programme est violemment mis en pause lorsque le garbage collections.Vous avez raison de dire que
System.gc()
agit d'une demande au compilateur et non une commande. Mais à l'aide de programme ci-dessous, vous pouvez assurez-vous qu'il se passe.Bien, la GC est toujours là -- vous ne pouvez pas créer des objets qui sont hors de sa portée (sauf si vous utilisez les appels natifs ou de les affecter directement octets de la mémoire tampon, mais dans le dernier cas, vous n'avez pas vraiment un objet, tout un tas d'octets). Cela dit, il est certainement possible de contourner le GC en réutilisant des objets. Par exemple, si vous avez besoin d'un tas de
ArrayList
objets, vous pouvez simplement créer à chacun, que vous en avez besoin et laissez-le GC gérer gestion de la mémoire, ou l'on pourrait appelerlist.clear()
sur chaque une fois que vous avez fini avec elle, et de le mettre sur une file d'attente où quelqu'un d'autre peut l'utiliser.Standard des meilleures pratiques sont à pas faire ce genre de réutilisation, sauf si vous avez de bonnes raisons de (ie, vous avez profilées et vu que les allocations + GC sont un problème, et que la réutilisation des objets résout ce problème). Elle conduit à plus de code compliqué, et si vous vous trompez, il peut réellement faire la GC a pour tâche plus difficile (en raison de la façon dont le GC pistes d'objets).
L'idée de base en Java, c'est que vous ne devez pas traiter avec de la mémoire à l'exception de l'aide de la "nouvelle" à attribuer de nouveaux objets et de s'assurer qu'il n'y a pas de références gauche des objets lorsque vous avez terminé avec eux.
Tout le reste est délibérément laissée à l'Exécution de Java et est - délibérément - défini comme vaguement possible pour permettre à la JVM des concepteurs de la plus grande liberté de le faire efficacement.
Pour utiliser une analogie: Votre système d'exploitation gère les zones nommées d'espace disque dur (appelés "fichiers") pour vous. Y compris la suppression et la réutilisation des zones que vous ne souhaitez pas utiliser plus. Vous n'avez pas de contourner ce mécanisme, mais laisser le système d'exploitation
Vous devriez vous concentrer sur la rédaction claire, simple code et veiller à ce que vos objets sont faits correctement. Cela donnera à la JVM les meilleures conditions de travail possibles.
Je vous propose de jeter un oeil à la suite de tutoriels et de son contenu
C'est un quatre partie tutoriel de la série à savoir sur les bases de la collecte des ordures dans
Java
:Java Collecte Des Ordures Introduction
Comment Java Collecte Des Ordures Fonctionne?
Types de Java éboueurs
De suivi et d'Analyse de Java Collecte des Ordures
J'ai trouvé Ce tutoriel très utile.
"Annuler"ing la référence lorsqu'il n'est pas nécessaire est le meilleur moyen de rendre un objet admissible pour la collecte des Ordures.
Il y a 4 façons dans lesquelles un objet peut être nettoyée.
1. point la référence à null, une fois qu'il n'est plus nécessaire.
Une fois que cette Chaîne n'est pas nécessaire, vous pouvez pointer vers null.
Par conséquent, s seront éligibles pour la collecte des Ordures.
point d'un objet à un autre, de sorte que les deux points de référence au même objet et celui de l'objet est admissible pour le GC.
String s1 = new String("Java");
String s2 = new String("C++");
À l'avenir si s2 doit également souligné s1;
Ensuite l'objet ayant "Java" seront éligibles pour le GC.
Tous les objets créés à l'intérieur d'une méthode sont admissibles pour le GC, une fois que la méthode est terminée. Par conséquent, une fois que la méthode est détruite à partir de la pile du thread puis les objets correspondants dans la méthode sera détruit.
Île de l'Isolement est un autre concept, où les objets avec des liens internes et non extrinsèque lien à une référence est admissible pour la collecte des Ordures.
"L'île de l'isolement" de la Collecte des Ordures
Exemples:
Ci-dessous est une méthode de la classe Camera pour android. Voir comment le développeur a fait mCameraSource null une fois qu'il n'est pas nécessaire. C'est l'expert au niveau du code.
Comment Garbage Collector fonctionne?
La collecte des ordures est effectué par le fil de démon appelé Garbage Collector. Lorsque la mémoire disponible est suffisante que le temps de ce démon fil de faible priorité, et il s'exécute en arrière-plan. Mais lorsque la JVM trouve que le tas est plein et JVM veut libérer un peu de mémoire, puis elle augmente la priorité de thread du Garbage collector et les appels de l'Exécution.getRuntime.gc (), une méthode de recherche de tous les objets qui sont de ne pas avoir de référence ou référence null et détruit les objets.