2010-11-25 16 views
2

J'utilise RandomAccessFile en java. J'ai un problème de fuite de mémoire. J'ai simplifié mon code à ce qui suit:RandomAccessFile Memory Leak

public static void main(String[] args) throws IOException, InterruptedException 
{ 
    RandomAccessFile r = new RandomAccessFile(new File("test.dat"), "rw"); 
    r.write(new byte[150000000], 0, 150000000); 
    r.getFD().sync(); 
    r.close(); 
    r = null; 

    while (true) { Thread.sleep(1000); } 
} 

Après l'exécution de ce code (et laisser suffisamment de temps pour GC) l'utilisation de la mémoire rapportée pour l'application est un peu plus de 150Mo.

Qu'est-ce que j'ai manqué? Ou Java est à blâmer?

Répondre

1

La mémoire n'est récupérée que lorsque le GC est exécuté et que le CPG ne s'exécute que lorsque cela est nécessaire. Essayez d'appeler System.gc() si vous voulez voir l'utilisation de la mémoire diminuer. BTW: Java n'est pas garanti pour retourner la mémoire au système d'exploitation, mais il tend à augmenter la mémoire libre en interne.

+2

Java * ne * Mémoire de retour au système d'exploitation, au moins la machine virtuelle Java Oracle ne, bien que très reluctanty. –

+0

@Michael, merci pour cela. –

2

Comment vérifiez-vous l'utilisation de la mémoire? L'utilisation signalée par le système d'exploitation indique seulement que le segment Java a pris de l'ampleur. Vous ne pouvez pas savoir si le tas est vide ou s'il est plein mais avec des objets éligibles pour GC.

Vous devez utiliser un outil associé à Java (par exemple, VisualVM ou jmap). Cela vous donnera une meilleure indication de l'état de la mémoire de tas. Avec VisualVM, vous pouvez activer un GC manuellement, puis vérifier l'occupation du tas pour déterminer s'il y a une fuite de mémoire ou non.

6

Le CPG mettra uniquement la mémoire à la disposition de la machine virtuelle Java. La mémoire libérée par GC est et non retournée automatiquement au système d'exploitation. La JVM est généralement très réticente à renvoyer de la mémoire au système d'exploitation, car elle peut en avoir besoin bientôt, et l'obtention de la mémoire à partir du système d'exploitation est une opération relativement coûteuse.

Pour voir les pourcentages de mémoire de tas utilisés et gratuits, vous pouvez utiliser Visual VM. Si vous voulez que la machine virtuelle Java pour revenir la mémoire à la mor OS avec impatience, vous pouvez utiliser le tuning parameters of the Oracle JVM, en particulier -XX:MaxHeapFreeRatio et -XX:MinHeapFreeRatio