Comment libérer de la mémoire en Java?
Est-il un moyen pour libérer de la mémoire en Java, semblable à C free()
fonction? Ou est de définir l'objet à null et en s'appuyant sur GC, la seule option?
- Ok... mettons-nous une chose au clair. Juste parce que vous pensez que quelque chose est une mauvaise pratique et pas quelque chose à encourager à faire, n'est pas digne d'un vote vers le bas. C'est une question valable, pour vous demander si il existe un moyen de libérer de la mémoire en Java avec l'extérieur en s'appuyant sur la collecte des ordures. Tandis qu'il peut être découragé et n'est généralement pas utile ou une bonne idée, vous ne peut pas savoir qu'il n'y a pas des scénarios dans lesquels il peut être nécessaire avec out savoir ce que Felix sait. Felix peut-être même pas l'intention de l'utiliser. Il peut veux juste savoir si c'est possible. Il peut, en aucun cas, mérite un vote vers le bas.
- Pour plus de précisions, qui s'adresse à ceux qui ont voté cette baisse pas les commentaires précédents nécessairement.
Vous devez vous connecter pour publier un commentaire.
Java utilise la mémoire gérée, donc la seule façon que vous pouvez allouer de la mémoire est à l'aide de la
new
de l'opérateur, et la seule façon vous pouvez libérer de la mémoire est en s'appuyant sur le garbage collector.Ce livre blanc la gestion de la mémoire (PDF) peut aider à expliquer ce qu'il se passe.
Vous pouvez également appeler
System.gc()
à suggérer que le garbage collector s'exécuter immédiatement. Cependant, le Java Runtime prend la décision finale, pas votre code.Selon la La documentation Java,
System.gc()
entièrement.System#gc
?Personne ne semble avoir mentionné en précisant les références de l'objet à
null
, ce qui est légitime technique de la "libération" de la mémoire vous pouvez envisager de.Par exemple, dire que vous auriez déclaré
List<String>
au début d'une méthode qui a grandi en taille très grand, mais il a été nécessaire jusqu'à mi-chemin par le biais de la méthode. Vous pouvez dans ce jeu de points de la Liste de référence pournull
pour permettre le garbage collector pour éventuellement récupérer cet objet avant la méthode est terminée (et la référence est hors de portée de toute façon).Noter que j'utilise rarement cette technique dans la réalité, mais il est utile d'envisager lorsque vous traitez avec de très grandes structures de données.
Pas recommandé.
Edit: j'ai écrit la réponse originale en 2009. C'est maintenant à 2015.
Éboueurs ont obtenu de façon constante mieux dans le ~20 ans de Java a été autour de. À ce stade, si vous êtes manuellement appeler le garbage collector, vous souhaitez peut-être envisager d'autres approches:
System.gc()
généralement recueille un peu de déchets. Pour tout rassembler, vous avez besoin de l'invoquer dans une boucle, à l'aide deRuntime.freeMemory()
pour surveiller lorsque la quantité de mémoire libre n'augmente plus. Mais l'appel deSystem.gc()
explicitement est en effet rarement nécessaire. Un cas où c'est utile, c'est quand vous êtes à essayer de mesurer la consommation de mémoire, depuis un GC exécuter dans le milieu de la gâchera vos mesures.*"Personnellement, je compter sur micropression variables comme un espace réservé pour une future bonne suppression. Par exemple, je prends le temps d'annuler tous les éléments d'un tableau avant de réellement supprimer (faisant null) le tableau lui-même."
C'est inutile. La façon la Java GC fonctionne est qu'il trouve des objets qui n'ont pas de référence à eux, donc, si j'ai un Objet x avec une référence (=variable) un que pointe, la GC ne pas le supprimer, car il y a une référence à cet objet:
Si vous null a que ce qui se passe:
Alors maintenant, x n'est pas une référence vers celui-ci et seront supprimés. La même chose se produit lorsque vous définissez une référence à un objet différent de x.
Donc, si vous avez un tableau arr que les références à des objets x, y et z et une variable a qui fait référence à l'ensemble qu'il ressemble à ça:
Si vous null a que ce qui se passe:
De sorte que le GC trouve arr comme n'ayant pas de référence et le supprime, ce qui vous donne cette structure:
Maintenant le GC trouve x, y et z et les supprime aswell. Micropression chaque référence, dans le tableau, de ne pas faire quelque chose de mieux, il suffit de l'utiliser jusqu'à temps de CPU et de l'espace dans le code (cela dit, il ne fait pas de mal, loin de là. Le GC sera toujours en mesure de fonctionner comme il le devrait).
Une raison valable pour vouloir libérer de la mémoire à partir de tout programme (java ou pas ) est de faire plus de mémoire disponible pour les autres programmes sur le niveau du système d'exploitation. Si mon application java est à l'aide de 250 MO je peut forcer vers le bas à 1 mo et de faire de la 249MB disponible pour d'autres applications.
À étendre la réponse et commentaire par Yiannis Xanthopoulos et Chaude Lèche (désolé, je ne peux pas commenter pour l'instant!), vous pouvez définir VM options comme dans cet exemple:
Dans mon jdk 7 ce sera ensuite communiqué de inutilisés de mémoire virtuelle si plus de 30% de la masse devient disponible après GC quand la VM est en veille. Vous aurez probablement besoin de tune de ces paramètres.
Alors que je ne l'ai souligné dans le lien ci-dessous, notez que certains éboueurs ne peut pas obéir à ces paramètres par défaut de java peut choisir l'un de ces pour vous, il vous arrive d'avoir plus d'un noyau (d'où le UseG1GC argument ci-dessus).
VM arguments
Mise à jour: java 1.8.0_73 j'ai vu la JVM parfois la libération de petites quantités avec les paramètres par défaut. Apparaît seulement à le faire si ~70% de la masse est inutilisé mais.. ne sais pas si il serait plus agressif libérant si l'OS a été faible sur la mémoire physique.
J'ai fait l'expérimentation de cette.
C'est vrai que
System.gc();
propose uniquement pour exécuter le Garbage Collector.Mais en l'appelant
System.gc();
après le réglage de toutes les références ànull
, permettra d'améliorer les performances et la mémoire de l'occupation.Si vous voulez vraiment allouer et de libérer un bloc de mémoire que vous pouvez faire cela avec direct ByteBuffers. Il y a même un non-portable de façon à libérer de la mémoire.
Toutefois, comme cela a été suggéré, juste parce que vous avez pour libérer de la mémoire en C, ne signifie pas une bonne idée d'avoir à le faire.
Si vous vous sentez vraiment avoir un bon cas d'utilisation de free(), veuillez l'inclure dans la question afin que nous puissions voir ce que vous rtying à faire, il est tout à fait probable qu'il y est une meilleure façon.
Entièrement à partir de javacoffeebreak.com/faq/faq0012.html
Dans mon cas, car mon code Java est destiné à être porté sur d'autres langues dans le futur proche (Principalement en C++), j'ai au moins envie de payer du bout des lèvres à la libération de la mémoire correctement de sorte qu'il aide le processus de portage plus tard.
Personnellement, je compter sur micropression variables comme un espace réservé pour une future bonne suppression. Par exemple, je prends le temps d'annuler tous les éléments d'un tableau avant de réellement supprimer (faisant null) le tableau lui-même.
Mais mon cas est très particulier, et je sais que je prends des performances lors de cette opération.
* ", Par exemple, de dire que tu avais déclaré une Liste au début d'une
la méthode qui a grandi en taille, être très grande, mais n'était nécessaire
jusqu'à mi-chemin par le biais de la méthode. Vous pouvez dans ce jeu de points de la
Liste de référence à une valeur null pour permettre le garbage collector potentiellement
récupérer cet objet avant la méthode est terminée (et la référence
est hors de portée de toute façon)." *
C'est correct, mais cette solution peut ne pas être généralisables. Pendant la configuration d'une Liste de référence de l'objet à null -va - faire de la mémoire disponible pour la collecte des ordures, ce n'est vrai que pour un objet de Liste de types primitifs. Si l'objet de la Liste contient les types référence, définissant l'objet de la Liste = null pas de déréférencement de -tout - les types de référence figurant dans la liste. Dans ce cas, définissant l'objet de la Liste = null orphelin contenus de types de référence dont les objets ne seront pas disponibles pour la collecte des ordures, à moins que la collecte des ordures algorithme est assez intelligent pour déterminer que les objets ont été rendus orphelins.
Bien qu'java fournit collecte des ordures automatique parfois, vous voulez savoir la taille de l'objet et combien il est à gauche .Libérer de la mémoire en utilisant par programmation
import java.lang;
etRuntime r=Runtime.getRuntime();
pour obtenir les valeurs de la mémoire à l'aide demem1=r.freeMemory();
pour libérer de la mémoire d'appel de lar.gc();
méthode et l'appelfreeMemory()
Recommandation de JAVA est à attribuer à la valeur null
De https://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html