web-dev-qa-db-fra.com

Supprimer la mémoire des variables inutilisées dans java

Je sais que Java possède sa propre collection de déchets, mais parfois je veux supprimer les déchets manuellement. Y a-t-il un moyen de faire le travail comme ça? Et étant donné que j'ai une longue ou très longue function qui déclare de nombreuses variables, est-ce une bonne idée de supprimer la mémoire inutilisée immédiatement après utilisation au lieu de la collecte automatique à la fin de la fonction? Si je supprime les ordures manuellement, cela affecte-t-il la vitesse de mon application? Merci pour ton aide!

36
Kingfisher Phuoc

Il n'existe aucun moyen direct et immédiat de libérer de la mémoire en Java. Vous pourriez essayer de persuader le garbage collector de retirer un objet en utilisant le bien connu:

Object obj = new Object();
// use obj
obj = null;
System.gc();

mais rien ne garantit que cela libérera immédiatement la mémoire.

Bien que cela s'applique à la mémoire de tas, les éléments alloués à la pile ne peuvent être libérés que lorsque la fonction revient.

36
Tudor

Pourquoi voulez-vous supprimer les ordures "manuellement"? Si c'est parce que vous manquez de mémoire, rappelez-vous que Java va exécuter la récupération de place avant de lancer OutOfMemoryError. Et si vous manquez vraiment de mémoire, alors il y a pas de déchets pour vous même à supprimer manuellement.

La déclaration d'une variable n'alloue pas de mémoire sur le tas. Faire un objet avec new le fait. Les machines virtuelles Java peuvent effectuer une analyse d'échappement jusqu'aux références d'objets GC qui ne sont pas hors de portée mais ne sont plus utilisées avant la fin de la méthode.

Si vous voulez libérer de la mémoire de manière proactive à un moment où les ressources système ne sont pas critiques, utilisez un meilleur réglage JVM, comme l'utilisation des algorithmes GC parallèles.

Le ramasse-miettes "manuellement" en définissant les choses sur null ralentit probablement les choses, ne serait-ce que parce que vous payez inutilement le coût de l'annulation des références ou en invoquant GC plus de fois que nécessaire.

15
Sean Owen

Vous pouvez appeler System.gc(); qui pourrait conduire le ramasse-miettes au nettoyage. Mais cela affectera certainement les performances de votre application. En général, cela n'a aucun sens d'essayer "d'optimiser" quoi que ce soit ici.

4
Kai

Cela ne vaut pas la peine de le faire manuellement, car le garbage collector fera généralement un meilleur travail, et le faire vous-même ne fera probablement pas de différence notable dans votre application.

Si vous devez, vous pouvez définir les références de variable sur null et appeler System.gc(), et cela appellera le garbage collector manuellement.

4
Oleksi

Vous pouvez attribuer null aux variables, vérifier qu'il n'y a aucune référence à ces objets et appeler System.gc (), mais il s'agit uniquement d'une suggestion pour que la JVM appelle un GC, mais il n'y a aucune garantie. Le calage de la collecte des ordures ralentit votre application jusqu'à un gel (GC stop-the-world).

3
dbf

Une suggestion très courante consiste à utiliser System.gc()Which que la JVM peut choisir d'ignorer. Vous pouvez également utiliser la portée, par exemple:

import Java.io.*;
public class AutoVariableTest
{
    public static void main(String[] args) throws Exception
    {
        String fileName = "test.txt";
        {// This is local block just to keep auto variable in check
            File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection
            BufferedReader br = null;

            try{
                br = new BufferedReader(new FileReader(file));
                // ...
            }finally{
                if(br != null)
                    br.close();
            }
        }// local block end
    }
}
2
Favonius

Si vous avez l'intention de réduire la quantité de mémoire utilisée après un certain point, il est préférable d'utiliser des tableaux pour vos variables afin de pouvoir définir un tableau sur null une fois qu'il n'est plus nécessaire. De cette façon, il faut beaucoup moins de temps au garbage collector pour nettoyer toutes vos données.

2
user2196966

Java ne convient pas si vous essayez de gérer la mémoire! Ou vous écrivez votre propre mécanisme de récupération de place dans JVM si vous avez beaucoup de temps

1
user691197