VisualVM Was erkennt ihr hier?

vimar

Bekanntes Mitglied
visualvm1.jpg



inwiefern sollte ich mich jetzt im programm bemühen? ich denke diese ganzen Stringinstanzen entstehen durch meine ganzen parserinstanzen die ich in meinem programm habe?`

sagt bitte einfach was ihr so denkt wenn ihr den screenshot seht. hab teilweise auslastung von 6 GB RAM für mein programm.

danke und mfg vimar
 
Es müsste irgendwo hier liegen, zeile 17 oder zeile 22 auslöser für sowas? ansich nicht oder?

ist es vllt der strtokenizer der mit nextToken() permanent neue string objekte erzeugt?

Java:
public csiftparser(String filename) throws InterruptedException{
            
            this.filename = filename;
            
           // KeyPointList = new ArrayList<Object>();
            AAO_kPointList = new ArrayList <ArrayList <Integer>>();
            
            
            try
            {
               in = new LineNumberReader (fr = new FileReader(filename));
     
                vcount = 0;
               
                //in.readLine();
    
                for (String line; (line = in.readLine()) != null;){
                    
                     // System.out.println(line);
                    //line = 300.91 351.43 28.79 2.884
                    
                    strToK_getCoordinates = new StringTokenizer(line);
                    akt_X = Double.parseDouble(strToK_getCoordinates.nextToken());
                    akt_Y = Double.parseDouble(strToK_getCoordinates.nextToken());
                    akt_Scale = Double.parseDouble(strToK_getCoordinates.nextToken());
                    akt_Orientation = Double.parseDouble(strToK_getCoordinates.nextToken());
                    
                    //System.out.println(akt_X);
                    // skip to next;
                   // line = in.readLine();
                  
                        for (int m =0; m < 3; m++){
                            kPoint = new siftKeyPoint();
                            kPoint.setX(akt_X);
                            kPoint.setY(akt_Y);
                            kPoint.setScale(akt_Scale);
                            kPoint.setOrientation(akt_Orientation);
                            
                            vcount = 0;
                            while (vcount < 7){
                                line = in.readLine();
                                vcount++;
                                strToK_getKeypoints = new StringTokenizer(line);
                                while(strToK_getKeypoints.hasMoreTokens()){
                                    temp = strToK_getKeypoints.nextToken();
                                    kPoint.getList().add(Integer.valueOf(temp));
                                    
                                }
                                
                                
                            }
                            AAO_kPointList.add(kPoint.getList());
                            
  
                        }
                    
 
                    
                       
               
                    
                    
                }
           
          
                
            }
        catch (IOException ex) {
            Logger.getLogger(csiftparser.class.getName()).log(Level.SEVERE, null, ex);
        }                
         finally {
                if (fr != null)
                    
                    try { 
                        System.out.println("allet weg");
                        fr.close();
                        in.close();
                        strToK_getKeypointquantity = null;
                        strToK_getCoordinates = null;
                        strToK_getKeypoints = null;
                        
                        //System.gc();
                    
                    }  
                    catch (IOException e) {
                        
                    }
            }
 
Konventionsverletzungen:
Packagename ALLUPPERCASE
Klassenname lowerCamelCase

wer auch immer sowas wie SIFT.kmeansPoint sollte sich mal den Link in meiner Signatur anschauen

----

Ah, und da gehts weiter:
Methoden werden lowerCamelCase geschrieben, genauso wie Variablen/Felder
 
danke 😱) allerdings hab ichs nicht hinbekommen immer dran zu denken und mach immer massen-refactor am ende eines projekts :>
 
OK, wenn die ganzen Strings aus einer Datei kommen, landen die Tokens im String-Pool - aber das sollte eigentlich nicht stören. Hattest du OutOfMemoryErrors?
 
ja die hatte ich. damals noch 3GB RAM.

hab nun auf 8 GB aufgestockt und diese vm-optionen:
-Xms5500m -Xmx5500m -XX:MaxPermSize=3048m -XX:+UseThreadPriorities -XX:MaxHeapFreeRatio=70 -XX:MinHeapFreeRatio=40 -XX:ReservedCodeCacheSize=32m -XX:+UseFastAccessorMethods -XX:+UseLargePages -XX:+UseStringCache -XX:+OptimizeStringConcat -XX:+UseCompressedStrings -XX:+UseG1GC -XX:MaxGCPauseMillis=25 -XX:GCPauseIntervalMillis=200


jetzt hab ich ruhe bez. heapsize outofmemory. allerdings MUSS ich noch mehr textfiles parsen als derzeit und werde an die 8GB grenze kommen. daher muss ich dieses String-Aufkommen irgendwie verringern!
 
[OT]Kannst du nächstes mal pls die Leerzeilen weglassen? Und versuchen keine unnötigen Zeilen zu machen? [JOKE] Denn schon das kostet Speicher [/JOKE] 😉 Hier mal verbessert:[/OT]

Java:
public csiftparser(String filename) throws InterruptedException{
            this.filename = filename;
           // KeyPointList = new ArrayList<Object>();
            AAO_kPointList = new ArrayList <ArrayList <Integer>>();

            try {
                in = new LineNumberReader (fr = new FileReader(filename));
                vcount = 0;
               
                //in.readLine();
                for (String line; (line = in.readLine()) != null;){
                    // System.out.println(line);
                    //line = 300.91 351.43 28.79 2.884
                    strToK_getCoordinates = new StringTokenizer(line);
                    akt_X = Double.parseDouble(strToK_getCoordinates.nextToken());
                    akt_Y = Double.parseDouble(strToK_getCoordinates.nextToken());
                    akt_Scale = Double.parseDouble(strToK_getCoordinates.nextToken());
                    akt_Orientation = Double.parseDouble(strToK_getCoordinates.nextToken());
                    
                    //System.out.println(akt_X);
                    // skip to next;
                    // line = in.readLine();
                    for (int m =0; m < 3; m++){
                            kPoint = new siftKeyPoint();
                            kPoint.setX(akt_X);
                            kPoint.setY(akt_Y);
                            kPoint.setScale(akt_Scale);
                            kPoint.setOrientation(akt_Orientation);
                            
                            vcount = 0;
                            while (vcount < 7){
                                line = in.readLine();
                                vcount++;
                                strToK_getKeypoints = new StringTokenizer(line);
                                while(strToK_getKeypoints.hasMoreTokens()){
                                    temp = strToK_getKeypoints.nextToken();
                                    kPoint.getList().add(Integer.valueOf(temp));
                                }
                            }
                            AAO_kPointList.add(kPoint.getList());
                        }
                  }
            }
        catch (IOException ex) {
            Logger.getLogger(csiftparser.class.getName()).log(Level.SEVERE, null, ex);
        }                
         finally {
                if (fr != null)
                    try { 
                        System.out.println("allet weg");
                        fr.close();
                        in.close();
                        strToK_getKeypointquantity = null;
                        strToK_getCoordinates = null;
                        strToK_getKeypoints = null;

                        //System.gc();
                    }  
                    catch (IOException e) {}
            }

😀:lol:🙂😉:bae:

mfg
BH16

PS: 28 Zeilen einfach durch Entfernung von Leerzeilen und unnötigen Zeilen gespart 😛
 
So aus Neugier, anstatt
Java:
temp = strToK_getKeypoints.nextToken();
das hier:
Java:
final String temp = strToK_getKeypoints.nextToken();
macht das irgendeinen Unterschied?
 

Zurück
Oben