web-dev-qa-db-fra.com

Augmentation de l'espace 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 a traité environ 500 000 enregistrements, mais cela me donnera une erreur 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 vient de la mémoire de VM, mais je ne sais pas comment l'augmenter dans Eclipse?

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

46
chetan

Dans Exécuter-> Exécuter la configuration, recherchez le nom de la classe que vous avez exécutée, sélectionnez-la, cliquez sur l'onglet Arguments, puis ajoutez:

-Xms512M -Xmx1524M

dans la section VM Arguments 

146
Paul Jowett

Dans le dossier de téléchargement Eclipse, entrez les données dans le fichier Eclipse.ini:

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

ou quelles que soient les valeurs que vous voulez.

37
Swagatika

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

-Xms et -Xmx définissent les tailles minimale et maximale du segment de mémoire. Présentée comme une fonctionnalité, Hotspot met un plafond sur la taille du segment de mémoire pour l'empêcher de détruire votre système. Ainsi, une fois que vous avez déterminé la mémoire maximale dont votre application a besoin, vous la limitez pour empêcher le code non autorisé d’affecter d’autres applications. Utilisez ces indicateurs tels que -Xmx512M, où M correspond à 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 au démarrage en augmentant le minimum, car il n’est pas nécessaire que le tas grossisse immédiatement.

-XX: MaxPermSize = ### M définit la taille maximale de "génération permanente". Hotspot est inhabituel dans la mesure où plusieurs types de données sont stockés dans la "génération permanente", une zone distincte du tas qui est rarement (ou jamais) collectée. La liste des données hébergées de façon permanente 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 internées, etc. (et cela varie certainement d'une version à l'autre de Hotspot). Parce que cette génération est rarement ou jamais collectée, vous devrez peut-être augmenter sa taille (ou activer le balayage permanent avec quelques autres drapeaux). Dans JRuby en particulier, nous générons beaucoup de bytecode d'adaptateur, qui demande généralement plus d'espace permanent.

7
RockyJ

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

Aller à 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 un max. de 2048 Mo (2 Go) de mémoire.

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

Réécrivez votre programme de telle sorte qu'il n'ait pas 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 stockiez beaucoup de données dans un HashMap il ne reste plus que de la mémoire lorsque vous avez beaucoup d'enregistrements.

5
Jesper

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

C'est ce qui a fonctionné pour moi après avoir constaté que je devais régulièrement augmenter la taille du segment de mémoire dans mon répertoire\Eclipse\eclipse.ini.

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

2
masarapmabuhay

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

-Xms512m

-Xmx2048m

-XX: MaxPermSize = 1024m

1
Sahi R. Repswal

Pour augmenter la taille de segment de mémoire dans Eclipse, 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

1
Rajesh Pantula

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

Voir ce lien .

Eclipse -vmargs -Xmx1024m

Edit: Voir aussi voir cette excellente question

1
Fredrik

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"

Je ne suis pas un pro de Java mais votre problème peut être résolu en "blockingqueue" si vous l'utilisez judicieusement. 

Essayez de récupérer d’abord un bloc d’enregistrements, de les traiter et d’itérer le processus jusqu’à ce que votre traitement soit terminé. Cela peut vous aider à vous débarrasser du OutOfMemory Exceptions.

0
sunil dhunde

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

-Xms512M -Xmx1524M

puis cliquez sur Appliquer.

0
rajlaxmi_jagdale

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

Il existe plusieurs méthodes pour augmenter la taille du segment de mémoire Java de votre application, que quelques-unes ont déjà suggérées. Votre application doit supprimer les éléments de votre adddressMap au fur et à mesure que votre application y ajoute un nouvel élément. Ainsi, vous ne rencontrerez plus de mémoire s'il y a plus d'enregistrements. Recherchez le producteur-consommateur si vous êtes intéressé.

0
Jasonw

Parfois, l’exception ne s’arrête pas après l’augmentation de la mémoire dans le fichier ini d’Eclipse. alors essayez l'option ci-dessous

Sélectionnez Fenêtre >> Préférences >> MyEclipse >> Projet Java Enterprise >> Projet Web >> Onglet Deployment Sous -> Sous Stratégies de déploiement de la bibliothèque UnCheck -> Jars des bibliothèques utilisateur

0