Java Mémoire: Heap Espace et Garbage Collector

En savoir plus sur la façon dont Java gère la mémoire à travers l'espace de tas et la collecte des ordures. Comprendre l'allocation de mémoire peut aider à éviter fuite de mémoire dans les programmes Java.

A+ A-

Récemment, j'ai écrit une application Java qui, lorsqu'il est exécuté, nécessite un peu de mémoire et je commençais à obtenir l'erreur OutOfMemory:

 Erreur: java.lang.OutOfMemoryError: Java heap space 

Cela arrive souvent quand nous avons besoin pour exécuter des programmes de mémoire gourmands. Voici quelques façons de résoudre de tels problèmes.

Qu'est-ce que Java heap space?

Tout d'abord, permet de comprendre ce qui est un espace de tas. Eh bien, Java utilise la mémoire principalement dans les arrangements de tas et de la pile . Java conserve les paramètres qui sont passés à partir d' une méthode d'appel à une méthode appelée , sous la forme d'une structure de pile (c. -à- paramètres sont poussés et sauté hors de la pile selon le besoin). D'autre part, tas est un espace de mémoire accessible au hasard où Java crée et maintient des objets. Java crée l'objet dans cet espace de tas où il trouve assez pour contenir l'objet chambre. Donc, lorsque vous créez un nouvel objet (par exemple nouvelle String () ;) l'objet est créé dans l'espace de tas et occupe la mémoire qu'elle peut adapter. Lors de la collecte des ordures, Java libère l'espace de tas de ces objets qui ne sont plus référencés. Mais si le nombre de référence (ie "nécessaire") des objets ne cesse d'augmenter et nous ne les déférence pas -la JVM fonctionne hors de l'espace de tas.

La quantité de mémoire qu'une classe nécessiterait dépend du nombre et du type de ses membres de données.

  1. La classe elle-même requiert un minimum de 8 octets
  2. Chaque membre de données nécessite 4 octets (longue et double nécessitent 8 octets). Même une variable booléenne est utiliser 4 octets si elle ne nécessite qu'un seul bit pour obtenir stocké.
  3. Quantité de mémoire utilisée croît en morceaux de 8 octets
Optimisez vos programmes Java

La première étape pour contourner ce problème devrait être de passer par le programme et voir comment il pourrait être modifié de manière à lui faire utiliser la mémoire moindre. Depuis longtemps le coût de la mémoire a été extrêmement faible par rapport à ce qu'elle était au cours des années 1960. Et les programmeurs sont devenus assez extravagant en termes d'allocation de mémoire pour leurs programmes. Cependant encore, plus souvent qu'autrement, nous avons besoin d'écrire des programmes qui nécessitent plus de mémoire que disponible. Frugalité dans le contexte d'utilisation de la mémoire est toujours bon, car non seulement il réduit les chances de plantage du programme, mais aussi parfois, il améliore la vitesse d'exécution.

Vous devez définir les objets à être nulle quand ils ne sont plus nécessaires dans votre code. Ceci est d'autant plus important si vous utilisez une boucle dans laquelle vous créez objet (s) mais ne les jetez pas quand ils ne sont pas nécessaires.

Faire usage de Java méthode garbage collector

La deuxième étape vers l'optimisation de l' utilisation de mémoire pourrait être d'appeler explicitement la méthode Garbage Collection. Java appelle automatiquement cette méthode en cas de besoin et libère l'espace mémoire qui contient les objets qui ne sont plus référencés. Mais vous pouvez aussi appeler cette méthode explicitement dans votre code (par exemple, après une "grande tâche" est accompli et la prochaine "grande tâche" est sur le point de commencer). Pour appeler le garbage collector, utilisez:

 Runtime.getRuntime () de gc (). 

Vous pouvez surveiller l'état de la mémoire avant et après la méthode de gc () est appelée.

 System.out.println ( "nnCalling Garbage Collectornn");
System.out.println ( "Mémoire libre AVANT:" + Runtime.getRuntime () freeMemory ().);
Runtime.getRuntime () de gc ().
System.out.println ( "Mémoire libre APRES:". + Runtime.getRuntime () freeMemory ());
System.out.println ( "nnGarbage collection finishednn"); 

méthode freeMemory () retourne quantité de mémoire disponible mesurée en octets. Pour d' autres méthodes fournies par la classe Runtime voir Java API

Donner plus de mémoire JVM

Les efforts pour l'utilisation de la mémoire d'optimisation malgré, parfois JVM ne besoins bien plus de mémoire. Dans de tels cas, nous pouvons dire JVM via la ligne de commande à utiliser une quantité de mémoire:

 java -Xms2000m -Xmx3500m 

-Xms Et -Xmx commutateurs spécifier la quantité d'espace d'échange (mémoire virtuelle) que JVM peut utiliser dans votre machine.

-Xms Spécifie la quantité minimale (ie initiale) de la mémoire

-Xmx Spécifie la quantité maximale de mémoire JVM pourrait utiliser.

Ces valeurs de mémoire doivent être spécifiées en mégaoctets.

Alors, ce fut à propos de Java gère la mémoire à travers l'espace de tas et le mécanisme de collecte des ordures. Ce sont des choix intelligents et tous les programmeurs Java doivent avoir une compréhension claire de la façon dont Java gère la mémoire. Seulement, vous serez en mesure de travailler efficacement sur des programmes intensifs de mémoire.