Java de collecte des ordures
Java automatiquement les appels garbage collector, alors pourquoi nous avons besoin de manuel d'appels pour la collecte des ordures? Quand faut utiliser Système.gc()
- En général, jamais.
- très similaire à ce post
Vous devez vous connecter pour publier un commentaire.
Nous n'avons pas besoin d'eux. En effet, dans la plupart des circonstances appelant
System.gc()
est néfastes pour la performance de l'application. Voir ma réponse à "Pourquoi est-ce une mauvaise pratique d'appeler système gc" pour une explication détaillée.Si l'application sait qu'il est dans une phase où elle n'a rien d'autre à faire ET que l'utilisateur a du mal à remarquer une collecte des ordures, alors peut-être que c'est OK appel à
System.gc()
dans un effort pour éviter que l'utilisateur connaît GC pauses dans l'avenir.Les inconvénients comprennent:
System.gc()
généralement déclenche un full GC qui prend beaucoup plus de temps qu'un GC de l'espace".System.gc()
entre les "niveaux" dans un jeu, vous effectuez le chargement du niveau suivant, prendre plus de temps.(Il peut aussi y avoir des raisons légitimes d'appel
System.gc()
dans les tests unitaires, et au cours de déboguer le système.)Il n'y a pas besoin de faire appel pour la collecte des ordures explicitement et en appelant
System.gc()
n'est qu'un suggestion, la JVM ne peut ignorer votre suggestion.Les seules utilisations pratiques, je pense,
Système.gc() n'est qu'une suggestion. Mais elle n'a de sens que dans certaines situations.
Supposons que vous avez la classe Maclasse, et vous vous demandez combien de mémoire un exemple à prendre. Ce que vous pouvez faire est de cela (en gros):
Il y a d'autres cas similaires, j'ai trouvé le Système.gc() pour être utile.
Un aspect pas encore mentionné, c'est que certains types d'objets peut demander à des entités extérieures à eux-mêmes de faire les choses à leur nom (par exemple, leur donner un accès exclusif à une non-fongibles ressource comme un fichier), au détriment d'autres entités. Quand un garbage collection est effectuée, le système ne sera pas seulement de libérer de la mémoire, qui était auparavant occupé par inaccessible objets, mais il sera également appel
finalize
sur les objets que les avis ont été abandonnés, permettant ainsi de tels objets de notifier des entités à l'extérieur que leurs services ne sont plus requis. Il est tout à fait possible pour un programme à atteindre un état où il y a beaucoup de mémoire, mais une ressource nécessaire n'est pas disponible parce que l'objet a été obtenu un accès exclusif et a depuis été abandonné sans le relâcher. En forçant le garbage-collector à s'exécuter dans une telle situation peut parfois libérer de la ressource nécessaire.finally
blocs (ou similaire) pour s'assurer que les ressources ne sont pas "fuite".try/finally
bloc [même si la JVM serait]; (2) si la base le constructeur de la classe acquiert une ressource et un dérivé constructeur de la classe de jette, la ressource de fuite à moins que la remise a eu lieu dans un try/finally bloc. Notez que...myThing = new Thing();
ne peut être enveloppé dans un try-enfin, si une telle déclaration jette, si oui ou non il acquiert des ressources, de la classe de base ressources des fuites sera difficile à éviter, puisqu'aucune référence à la base de la classe de l'objet existe. Le seul moyen que je connaisse pour éviter les fuites de ressource dans de tels cas est d'utiliserThreadLocal
de garder une trace de ressources qui ont été acquis mais n'a pas encore été "remis" à des entités qui ont promis de les fermer.AutoCloseable[1]
tableau pour le constructeur, et ont le constructeur de base magasinthis
là, mais que cela entraîne un trop-près de couplage entre les classes de base et dérivées, et il n'y a pas de convention standard pour elle.new Subclass(...)
vous pouvez le remplacer par un appel à une méthode de fabrique.close()
méthode de la superclasse sur le moyen de sortir.Thing thingie = new Thing(this, that, theOther);
il n'y a aucun moyen de étirable dans un try/finally.Le garbage collector est toujours appelé par la JVM quand il n'y a pas assez de mémoire pour allouer de nouveaux objets dans le tas. Tout en appelant le garbage collector, il suit l'Arrêt du Monde de normes et de ce qu'il appelle la
System.gc()
méthode.Rappelez-vous aussi que la JVM aussi, parallèle à la gc fils à supprimer les objets de la mémoire . Donc, tout et chaque minute de la JVM conserve la mémoire du tas et essaie toujours de ne pas la surcharger. Donc, il n'y a aucune obligation d'appeler explicitement
System.gc()
ouRuntime.gc()
méthode.Si vous voulez plus de détails sur ce que vous pouvez obtenir ici les informations pertinentes.
Processus de nettoyage n'est pas sous le contrôle de l'utilisateur.Donc, il ne fait pas de sens d'appeler
System.gc();
explicitement. Il entièrement dépend de la JVM.Quelques jours en arrière, j'avais posé exactement la même question : [Ici].
En fait, de nombreuses questions liées à l'appel de
System.gc();
explicitement ont déjà été posées et répondues ici. L'appel deSystem.gc();
explicitement est toujours considéré comme pauvres de compétences en programmation, bien qu'il ne pourra pas faire de mal.Voici les quelques liens que je vous devez aller à travers elle. Il va certainement clarifier vos doutes.
Il n'est pas nécessaire d'appeler
System.gc()
ouRuntime.getRuntime().gc()
. La JVM en interne les contrôles de la collecte des ordures s'il constate qu'il est à court de mémoire.