Augmentation de l’espace de stack dans Eclipse: (java.lang.OutOfMemoryError)

try { // CompareRecord record = new CompareRecord(); Connection conn = new CompareRecord().getConection("eliteddaprd","eliteddaprd","192.168.14.104","1521"); ResultSet res = null; if (conn != null){ Statement stmt = conn.createStatement(); res = stmt.executeQuery("select rowindx,ADDRLINE1 from dedupinitial order by rowindx"); } Map adddressMap = new LinkedHashMap(); if (res != null){ System.out.println("result set is not null "); while(res.next()){ adddressMap.put(res.getInt(1),res.getSsortingng(2)); } } System.out.println("address Map size =========> "+adddressMap.size()); Iterator it = adddressMap.entrySet().iterator(); int count = 0; int min = 0; while (it.hasNext()){ Map.Entry pairs = (Map.Entry)it.next(); Pattern p = Pattern.comstack("[,\\s]+"); Integer outerkey = (Integer)pairs.getKey(); Ssortingng outerValue = (Ssortingng)pairs.getValue(); //System.out.println("outer Value ======> "+outerValue); Ssortingng[] outerresult = p.split(outerValue); Map.Entry pairs2 = null; count++; List dupList = new ArrayList(); Iterator innerit = adddressMap.entrySet().iterator(); boolean first = true; while (innerit.hasNext()){ //System.out.println("count value ===> "+count); int totmatch = 0; if(first){ if(count == adddressMap.size()){ break; } for(int i=0;i<=count;i++){ pairs2 = (Map.Entry)innerit.next(); } first = false; } else{ pairs2 = (Map.Entry)innerit.next(); } Integer innterKey = (Integer)pairs2.getKey(); String innerValue = (String)pairs2.getValue(); //System.out.println("innrer value "+innerValue); String[] innerresult = p.split(innerValue); for(int j=0;j<outerresult.length;j++){ for(int k=0;k 50) { //System.out.println("maching inner key =========> "+innterKey); dupList.add(innterKey); } } //System.out.println("Duplilcate List Sisze ===================> "+dupList.size()+" "+outerkey); } System.out.println("End =========> "+new Date()); } catch (Exception e) { e.printStackTrace(); } 

Ici ResultSet a traité environ 500 000 enregistrements, mais cela me donnera des erreurs comme:

 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.resize(HashMap.java:508) at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:406) at java.util.HashMap.put(HashMap.java:431) at spite.CompareRecord.main(CompareRecord.java:91) 

Je sais que cette erreur est due à la mémoire de la machine virtuelle, mais je ne sais pas comment l’augmenter dans Eclipse?

Que dois-je faire si je dois traiter plus de 500 000 enregistrements?

Dans Run-> Run Configuration, recherchez le nom de la classe que vous avez exécutée, sélectionnez-le, cliquez sur l’onglet Arguments, puis ajoutez:

-Xms512M -Xmx1524M

à la section VM Arguments

Dans le dossier de téléchargement Eclipse, saisissez les entrées du fichier eclipse.ini :

 --launcher.XXMaxPermSize 512M -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms512m -Xmx1024m 

ou quelles que soient les valeurs que vous voulez.

Voir http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-Xms et -Xmx définissent les tailles minimum et maximum pour le tas. Considéré comme une fonctionnalité, Hotspot limite la taille du tas pour l’empêcher de faire exploser votre système. Ainsi, une fois que vous avez déterminé la mémoire maximale dont votre application a besoin, vous la limitez pour éviter que le code malveillant n’affecte d’autres applications. Utilisez ces indicateurs comme -Xmx512M, où M représente MB. Si vous ne l’incluez pas, vous spécifiez des octets. Plusieurs drapeaux utilisent ce format. Vous pouvez également obtenir une amélioration mineure de la performance de démarrage en définissant un minimum plus élevé, car il n’est pas nécessaire de développer le tas immédiatement.

-XX: MaxPermSize = ### M définit la taille maximale de “génération permanente”. Hotspot est inhabituel en ce que plusieurs types de données sont stockés dans la “génération permanente”, une zone distincte du tas qui n’est que rarement (ou jamais) collectée. La liste des données hébergées par perm-gen est un peu floue, mais elle contient généralement des éléments tels que les métadonnées de classe, le bytecode, les chaînes internes, etc. (et cela varie certainement selon les versions de Hotspot). Étant donné que cette génération est rarement ou jamais collectée, vous devrez peut-être augmenter sa taille (ou activer le balayage permanent avec deux autres indicateurs). Dans JRuby en particulier, nous générons beaucoup de bytecode d’adaptateur, ce qui nécessite généralement plus d’espace de génération.

Comment donner à votre programme plus de mémoire lors de l’exécution à partir d’Eclipse

Accédez à Exécuter / Exécuter les configurations. Sélectionnez la configuration d’exécution pour votre programme. Cliquez sur l’onglet “Arguments”. Dans la zone “Arguments du programme”, ajoutez un argument -Xmx , par exemple -Xmx2048m pour donner à votre programme une valeur maximale. de 2048 Mo (2 Go) de mémoire.

Comment prévenir ce problème de mémoire

Réécrivez votre programme de manière à ne pas avoir besoin de stocker autant de données en mémoire. Je n’ai pas examiné votre code en détail, mais il semble que vous HashMap beaucoup de données dans un HashMap ; plus que la mémoire quand vous avez beaucoup de disques.

Pour augmenter la taille du segment de mémoire dans éclipse, modifiez le fichier eclipse.ini.

faire référence à

http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F

Vous pouvez augmenter la taille de la mémoire en utilisant des arguments de ligne de commande.

Voir ce lien .

eclipse -vmargs -Xmx1024m

Edit: Voir aussi voir cette excellente question

Vous souhaiterez peut-être fermer les projets ouverts dans votre explorateur de projet. Vous pouvez le faire en cliquant avec le bouton droit sur un projet ouvert et en sélectionnant “Fermer le projet”.

C’est ce qui a fonctionné pour moi après avoir remarqué que je devais régulièrement augmenter la taille du tas dans mon répertoire \ eclipse \ eclipse.ini.

J’espère que cela t’aides! Paix!

Que faire si je dois traiter encore plus que 500 000 enregistrements?

Il existe plusieurs moyens d’augmenter la taille du tas Java de votre application là où certains l’ont déjà suggéré. Votre application doit supprimer les éléments de votre adddressMap à mesure que votre application y ajoute un nouvel élément et que vous ne rencontrerez pas de nouveaux enregistrements. Recherchez un producteur-consommateur si cela vous intéresse.

Je ne suis pas pro en Java mais votre problème peut être résolu par “blockingqueue” si vous l’utilisez judicieusement.

Essayez d’abord de récupérer une partie des enregistrements, de les traiter et d’itérer le processus jusqu’à la fin du traitement. Cela peut vous aider à vous débarrasser des OutOfMemory Exceptions .

Dans Eclipse goto Exécuter-> Exécuter la configuration, recherchez le nom de la classe que vous avez exécutée, sélectionnez-le, cliquez sur l’onglet Cible puis dans «Options supplémentaires de la ligne de commande de l’émulateur», ajoutez:

-Xms512M -Xmx1524M

puis cliquez sur Appliquer.

Allez dans “Fenêtre -> Préférences -> Général -> C / C ++ -> Analyse de code” et désactivez “Erreurs de syntaxe et de sémantique -> La classe abstraite ne peut pas être instanciée”

Dans le fichier eclipse.ini, saisissez les entrées ci-dessous

-Xms512m

-Xmx2048m

-XX: MaxPermSize = 1024m

Parfois, l’exception ne s’arrête pas après que vous augmentez la mémoire dans le fichier eclipse ini. puis essayez l’option ci-dessous

Allez à la fenêtre >> Préférences >> MyEclipse >> Projet Java Enterprise >> Projet Web >> Onglet Déploiement Sous -> Sous Politiques de déploiement de la bibliothèque UnCheck -> Jars from User Libraries