L'augmentation de la mémoire 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<Integer,String> adddressMap = new LinkedHashMap<Integer, String>();
if (res != null){
System.out.println("result set is not null ");
while(res.next()){
adddressMap.put(res.getInt(1),res.getString(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.compile("[,\\s]+");
Integer outerkey = (Integer)pairs.getKey();
String outerValue = (String)pairs.getValue();
//System.out.println("outer Value ======> "+outerValue);
String[] outerresult = p.split(outerValue);
Map.Entry pairs2 = null;
count++;
List<Integer> dupList = new ArrayList<Integer>();
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<innerresult.length;k++){
if(outerresult[j].equalsIgnoreCase(innerresult[k])){
//System.out.println(outerresult[j]+" Match With "+innerresult[k]);
totmatch++;
break;
}
}
}
min = Math.min(outerresult.length, innerresult.length);
if(min != 0 && ((totmatch*100)/min) > 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 ont traité près de 500000 enregistrements, mais il me donnera l'erreur de ce type:
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 vient du fait que, de mémoire virtuelle, mais vous ne savez pas comment faire pour l'augmenter dans Eclipse?
Que dois-je faire si je n'ai même plus de 500 000 dossiers?
- Peut-être vous avez besoin de changer la logique. pourquoi vous avez besoin de 500000 enregistrements en un seul coup.
- Dans presque tous les cas comme cela, il est exact que le code doit être améliorée, mais la plupart du temps qui n'est pas réalisable à court terme et vous avez besoin d'une solution immédiatement.
Vous devez vous connecter pour publier un commentaire.
À Exécuter->Exécuter la Configuration de trouver le Nom de la classe que vous avez été en cours d'exécution, sélectionnez-le, cliquez sur l'onglet Arguments puis ajouter:
-Xms512M -Xmx1524M
à la VM Arguments section
Dans l'Eclipse téléchargement de dossier les entrées dans la
eclipse.ini
fichier :ou ce que jamais les valeurs que vous voulez.
$ cd /Applications/eclipse/; find . | grep eclipse.ini
Voir http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-Xms et -Xmx définir les tailles minimale et maximale pour le tas. Présenté comme une fonctionnalité Hotspot met le cap sur le tas de la taille pour l'empêcher de gonfler votre système. Donc, une fois que vous trouver le max de mémoire de votre application, vous cap à garder les voyous de code à partir d'impact sur les autres applications. Utiliser ces indicateurs comme -Xmx512M, où M représente MO. Si vous n'en avez pas, vous êtes en précisant octets. Plusieurs drapeaux utiliser ce format. Vous pouvez également obtenir un mineur de démarrage perf boost en réglage minimum plus élevé, car il n'a pas à pousser le tas tout de suite.
-XX:MaxPermSize=###M fixe le maximum de la "génération permanente" taille de. Hotspot est inhabituel en ce que plusieurs types de données sont stockés dans la "génération permanente", une zone séparée de la masse, qui n'est que rarement (ou jamais) le garbage collector. La liste de perm gen d'hébergement de données est un peu floue, mais il contient généralement des choses comme les métadonnées de la classe, du bytecode, interné cordes, et ainsi de suite (et c'est certainement varie Hotspot versions). Parce que cette génération est rarement ou jamais collecté, vous devrez peut-être augmenter sa taille (ou activer perm gen de balayage avec un couple d'autres options). En JRuby-nous surtout de générer un grand nombre de carte de bytecode, qui exige en général plus de perm gen espace.
Façon de donner à votre programme de plus de mémoire lors de l'exécution d'Eclipse
Aller à Exécuter /Exécuter les Configurations. Sélectionnez la configuration d'exécution de votre programme. Cliquez sur l'onglet "Arguments". Dans le "Programme" arguments de la zone, ajouter un
-Xmx
argument, par exemple-Xmx2048m
pour donner à votre programme un max. de 2048 MO (2 GO) de mémoire.Comment prévenir ce problème de mémoire
De ré-écrire votre programme de telle sorte qu'il n'a pas besoin de stocker une grande quantité de données dans la mémoire. Je n'ai pas regardé ton code en détail, mais on dirait que vous êtes le stockage d'un grand nombre de données dans un
HashMap
; plus que celui qui entre dans la mémoire lorsque vous avez beaucoup de dossiers.Vous souhaitez fermer les projets ouverts dans votre Explorateur de Projet. Vous pouvez le faire en cliquant droit sur un projet ouvert, et en sélectionnant "Fermer le Projet".
C'est ce qui a fonctionné pour moi, après j'ai remarqué que j'avais d'augmenter périodiquement la taille de segment de mémoire dans my_directory\eclipse\eclipse.ini.
Espérons que cette aide! La paix!
Pour augmenter la taille du Segment de mémoire dans eclipse changement de l'éclipse.fichier ini.
reportez-vous à
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 par le biais de l'utilisation de la ligne de commande arguments.
Voir ce lien.
eclipse -vmargs -Xmx1024m
Edit: voir Aussi voir cette excellente question
Dans eclipse.fichier ini, de faire ci-dessous entrées
-Xms512m
-Xmx2048m
-XX:MaxPermSize=1024m
Il y a quelques moyens, pour augmenter la java taille de segment de mémoire pour votre application, où quelques-uns ont déjà suggéré. Votre app besoin de supprimer les éléments de votre adddressMap que votre application ajouter un nouvel élément et donc vous ne rencontrerez pas oom si il y a plus d'enregistrements à venir dans. Regardez pour les producteurs et les consommateurs, si vous êtes intéressé.
Je ne suis pas pro en Java, mais que votre problème peut être résolu par "blockingqueue" si vous l'utilisez à bon escient.
Essayez de récupérer une partie des enregistrements, de les traiter, et de réitérer le processus jusqu'à ce que vous terminez votre traitement. Cela peut vous aider à vous débarrasser de la
OutOfMemory Exceptions
.Dans Eclipse goto Exécuter->Exécuter la Configuration de trouver le Nom de la classe que vous avez été en cours d'exécution, sélectionnez-le, cliquez sur l'onglet Cible, puis dans "Autres Émulateur Options de Ligne de Commande" ajouter:
-Xms512M -Xmx1524M
puis cliquez sur appliquer.
Aller à "Window -> Préférences -> Général> C/C++ -> analyse de Code"
et de le désactiver et de la Syntaxe et de la Sémantique des Erreurs -> classe Abstraite ne peut pas être instancié"
Parfois, l'exception ne s'arrêtera pas après que vous augmentez la mémoire dans eclipse fichier ini. ensuite, essayez l'option en dessous
Aller à la Fenêtre >> Préférences >> MyEclipse >> Java Enterprise Project >> Projet Web >> Onglet Déploiement
Sous -> en Vertu de la Bibliothèque de Stratégies de Déploiement de l'
Décochez l'option -> Pots à partir de l'Utilisateur des Bibliothèques de
Window >> Preferences >> MyEclipse >> Java Enterprise Project >> Web Project >> Deployment Tab Under