J'obtiens cette erreur dans un programme qui crée plusieurs (centaines de milliers) objets HashMap avec quelques (15-20) entrées de texte chacun. Ces chaînes de caractères doivent toutes être rassemblées (sans être divisées en petites quantités) avant d'être soumises à une base de données.
Selon Sun, l'erreur se produit "si trop de temps est consacré à la collecte des déchets : si plus de 98% du temps total est consacré à la collecte des déchets et que moins de 2% du tas est récupéré, un OutOfMemoryError sera lancé".
Apparemment, on pourrait utiliser la ligne de commande pour passer des arguments à la JVM pour
- Augmenter la taille du tas, via "-Xmx1024m" (ou plus), ou
- Désactiver complètement le contrôle d'erreur, via "-XX:-UseGCOverheadLimit".
La première approche fonctionne bien, la seconde aboutit à une autre erreur java.lang.OutOfMemoryError, cette fois-ci concernant le tas.
J'ai donc une question : existe-t-il une alternative programmatique à cela, pour le cas d'utilisation particulier (c'est-à-dire plusieurs petits objets HashMap) ? Si j'utilise la méthode HashMap clear(), par exemple, le problème disparaît, mais les données stockées dans le HashMap aussi ! :-)
La question est également abordée dans un Sujet connexe dans StackOverflow.
1 votes
Vous devrez peut-être modifier votre algorithme et utiliser une structure de données plus efficace. Pouvez-vous nous dire quel algorithme vous essayez d'implémenter qui nécessite autant de HashMaps ?
0 votes
Je suis en train de lire de très gros fichiers texte (des centaines de milliers de lignes chacun), sur lesquels je n'ai aucun contrôle, c'est-à-dire qu'ils ne peuvent pas être décomposés. Pour chaque ligne de texte, on construit un HashMap qui contient quelques (en fait environ 10) petites valeurs de type String, en utilisant encore et encore les mêmes noms de champs de la base de données. Idéalement, j'aimerais pouvoir lire l'intégralité du fichier avant d'envoyer les données à la base de données.
1 votes
Il semble que la lecture de l'ensemble du fichier avant l'envoi des données à la base de données soit une mauvaise solution... en fait, elle ne fonctionne pas du tout, compte tenu des contraintes réelles de la mémoire disponible. Pourquoi voulez-vous faire cela de toute façon ? Que voulez-vous dire par "utiliser les mêmes noms de champs de la base de données encore et encore" ? Les noms de champs comme clés ou valeurs ? Si les champs sont des clés, il suffit d'utiliser un tableau, où le champ est IMPLIQUÉ par sa position... et si ce sont des valeurs, il faut les interner avant de les ajouter aux cartes. Il serait utile de savoir ce que sont les données. Merci. Keith.
1 votes
Il s'agit de clés ayant une valeur constante. Le stage semble aider, merci.