Alors que nous continuons dans cette série de problèmes de performances de simulation et de dépannage dans Scala, discutons maintenant de la façon de simuler le java.lang.OutOfMemoryError: Java Heap
espace problème. java.lang.OutOfMemoryError: Java Heap space
sera lancée par l’application Scala lorsqu’elle génère plus d’objets que la taille de tas maximale configurée.
Programme Scala OutOfMemoryError
Voici un exemple de programme Scala, qui génère le java.lang.OutOfMemoryError: Java Heap space
problème:
package com.yc
import java.util
class OOMApp {
} object OOMApp {
var myMap = new util.HashMap[String,String]()
def main(args: Array[String]): Unit = {
var counter = 0;
while (true) {
System.out.println("Inserting large String")
myMap.put("key"+counter, "Large stringgggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"
+ counter)
counter = counter+(1);
}
}
}
Cet exemple de programme Scala contient un OOMApp
classe. Étant donné que cette classe contient les while(true)
boucle, il continue d’insérer des enregistrements dans la HashMap
infiniment. Quand HashMap
croît au-delà de la taille de tas maximale (c’est-à-dire -Xmx), le java.lang.OutOfMemoryError: Java Heap space
sera jeté. Le schéma ci-dessous illustre les enregistrements présents dans le HashMap
.

HashMap provoquant OutOfMemoryError
Lorsque nous avons exécuté le programme ci-dessus, comme prévu, java.lang.OutOfMemoryError: Java heap space
a été lancé en quelques secondes.
Même s’il s’agit d’un exemple hypothétique qui simule java.lang.OutOfMemoryError
, c’est ainsi qu’une fuite de mémoire typique se produit dans les applications d’entreprise. Lorsque des enregistrements sont insérés dans une structure de données (comme HashMap
, ArrayList
, Set
etc.) et ne jamais être retiré, java.lang.OutOfMemoryError
sera jeté.
Comment dépanner OutOfMemoryError
Vous pouvez diagnostiquer OutOfMemoryError
soit par une approche manuelle ou automatisée.
Approche manuelle
Dans l’approche manuelle, vous devrez capturer un vidage de tas comme première étape. Un vidage de tas est un instantané de la mémoire qui affiche tous les objets en mémoire, les valeurs contenues par ces objets et leurs références. Vous pouvez capturer un vidage de tas en utilisant l’une des 7 approches données ici, mais un critère important est que vous devez capturer le vidage de tas juste avant OutOfMemoryError
Est lancé. Si vous comptez capturer un vidage de tas après OutOfMemoryError
s’est produit, les objets qui fuient peuvent être collectés et il deviendra difficile (voire impossible) de diagnostiquer le problème. Une fois les vidages de tas capturés, vous devez importer les vidages de tas de vos serveurs de production vers votre machine locale. À partir de votre ordinateur local, vous pouvez utiliser des outils d’analyse de vidage de tas comme jHat et HeapHero pour analyser les vidages de tas.
Approche automatisée
D’autre part, vous pouvez également utiliser le script open source yCrash, qui capturerait des données à 360 degrés (journal GC, 3 instantanés de thread dump, heap dump, netstat, iostat, vmstat, top, top -H, etc.) depuis votre pile d’applications en une minute et générez un fichier zip groupé. Vous pouvez ensuite analyser manuellement ces artefacts ou les télécharger sur le serveur yCrash pour une analyse automatisée.
Nous avons utilisé l’approche automatisée. Une fois que les artefacts capturés ont été téléchargés sur le serveur yCrash, il a généré instantanément le rapport d’analyse des causes profondes ci-dessous mettant en évidence la source du problème.
Rapport d’analyse de vidage de tas généré par l’outil yCrash

Outil yCrash indiquant la cause première de OutOfMemoryError
Le rapport d’analyse de vidage de tas ci-dessus provient de l’outil qui indique précisément que le HashMap
(c’est à dire, myMap
) structure de données présente dans le com.yc.OOMApp$.myMap
être à l’origine de la fuite de mémoire. En outre, l’outil signale que cela HashMap
détient 99% de la mémoire.
Équipé de ces informations, on peut facilement aller de l’avant et corriger le code problématique.
Vidéo
Pour voir la présentation visuelle de cet article, cliquez ci-dessous :