53 votes

Augmentation de l'espace de segment de 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 doit traiter environ 500 000 enregistrements, mais cela me donnera l'erreur suivante:

 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 la machine virtuelle, mais je ne sais pas comment l'augmenter en éclipse.?

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

156voto

jowierun Points 4127

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

à la section VM Arguments

42voto

Swagatika Points 1525

Dans le dossier de téléchargement Eclipse, saisissez les entré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.

7voto

RockyJ Points 108

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 de l'espace.

6voto

Jesper Points 65733

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

Aller à la Run / Run 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

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 de la tienne dans la mémoire lorsque vous avez beaucoup de dossiers.

1voto

Rajesh Rao Points 2990

Pour augmenter la taille du 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X