2015-08-11 26 views
5

Sono fatto un programma che usa un algoritmo di ricerca A * per risolvere 8 puzzle di gioco. Ero interessato a vedere quanta memoria viene utilizzata dal mio programma dall'inizio alla fine.Quanta memoria è il mio programma usando Java

Finora ho fatto

All'inizio del programma

static double totalMem = Runtime.getRuntime().totalMemory()/(1024*1024); 
static double memoryMax = Runtime.getRuntime().maxMemory()/(1024*1024); 

e alla fine del programma

 timeTaken-=System.currentTimeMillis(); 

     System.out.println("\n\n-------Total Time Taken = "+Math.abs(timeTaken)+ 
       " millisec ------\n "); 

     System.out.println("-------Maximum Memory = "+memoryMax+" MB------\n "); 

     System.out.println("-------Total Memory = "+totalMem 
       +" MB------\n "); 

     currMem = Runtime.getRuntime().freeMemory()/(1024*1024); 

     System.out.println("-------Free Memory = "+currMem+" MB------\n "); 

     double memUsed = (Runtime.getRuntime().totalMemory())/(1024*1024)-currMem; 

     System.out.println("-------Total Used = "+memUsed 
       +" MB------\n "); 

Questo non sembra essere di destra. Quando provo con diversi set di dati. Qualsiasi suggerimento

+1

"Questo non sembra essere giusto." Perché? – Stefan

+0

Qual è il problema con il codice sopra? –

+0

http://www.vogella.com/tutorials/JavaPerformance/article.html –

risposta

6

Sarebbe meglio usare profiler o software simile per questo scopo. Puoi iniziare con jvisualvm incluso in JDK o JProfiler.

0

Il problema sembra correlato al buffer di allocazione locale del thread.
Gli oggetti potrebbero essere creati su TLAB.
Leggi questo: https://blogs.oracle.com/jonthecollector/entry/the_real_thing
Quindi ogni volta che si esegue il programma, mostrerà valori simili.
Eseguire il programma spegnendo questa funzione, passare sotto in argomenti VM: -

-XX:-UseTLAB 
0

è anche possibile utilizzare "Java Mission Control" (versione più recente di jvisualvm), che consente di effettuare istantanee della memoria . Aggiungere questi parametri all'avvio del programma:

-XX:+UnlockCommercialFeatures 
-XX:+FlightRecorder 
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=true 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

sua nella cartella "bin" del JDK 7 anche, chiamato: "jmc.exe"

0

Runtime funziona correttamente. Potresti fare la differenza prima di eseguire la logica e dopo vedere la quantità di memoria utilizzata. Un rapido esempio

import java.util.ArrayList; 
import java.util.List; 

public class MemoryTest { 

    private static final int KB = 1024; 

    public static void main(String[] args) { 
     long initialMemory = getUsedMemory(); 
     List<String> dummy = new ArrayList<String>(); 
     for(int i=0; i<10000; i++){ 
      dummy.add("Dummy " + i); 
     } 
     System.out.println("Total used by program = " + (getUsedMemory() - initialMemory) + " KB"); 
    } 

    private static long getUsedMemory() { 
     Runtime runtime = Runtime.getRuntime(); 
     return (runtime.totalMemory() - runtime.freeMemory())/KB; 
    } 
} 
+0

Funziona benissimo fino a quando non superi la memoria totale. Nel tuo caso non supererà il totale di memoria. Ma una volta superato TotalMemory, utilizzerà maxMemory e, se supera, sarà in un limbo .. –