Ce face Runtime.totalMemory
totalMemory() returnează, în octeți, câtă memorie a rezervat JVM-ul pentru obiecte (heap) în acest moment. Valoarea poate crește în timpul rulării, până la limita dată de maxMemory() (setată cu opțiunea -Xmx). freeMemory() returnează cât din totalMemory() este încă liber.
Memoria folosită de program este totalMemory() - freeMemory(). Valoarea este aproximativă și se schimbă după fiecare curățare făcută de garbage collector, deci diferă la fiecare rulare. Pentru analize serioase folosește instrumente ca JDK Mission Control sau VisualVM.
Ce returnează
Un long, număr de octeți.
Exemple
Exemplul 1: Memoria programului
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Rezervată: " + rt.totalMemory() / mb + " MB");
System.out.println("Liberă: " + rt.freeMemory() / mb + " MB");
System.out.println("Folosită: " + (rt.totalMemory() - rt.freeMemory()) / mb + " MB");
System.out.println("Maximă: " + rt.maxMemory() / mb + " MB");
}
}
Rezultat posibil (diferă la fiecare rulare)
Rezervată: 64 MB
Liberă: 61 MB
Folosită: 3 MB
Maximă: 4096 MB
Exemplul 2: Relațiile dintre valori
Valorile exacte diferă, dar relațiile dintre ele sunt mereu adevărate.
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long total = rt.totalMemory();
long liber = rt.freeMemory();
long maxim = rt.maxMemory();
System.out.println("liberă <= rezervată: " + (liber <= total));
System.out.println("rezervată <= maximă: " + (total <= maxim));
System.out.println("folosită > 0: " + (total - liber > 0));
}
}
Rezultat
liberă <= rezervată: true
rezervată <= maximă: true
folosită > 0: true
Greșeli frecvente
- Crezi că
freeMemory()este memoria liberă a calculatorului: este doar partea liberă din heap-ul JVM-ului. - Apelezi
System.gc()înainte de fiecare măsurătoare ca să ai „cifre curate”: este doar o sugestie pentru JVM și încetinește programul.
Comenzi înrudite
Runtime: Obiectul care descrie mediul în care rulează programul: procesoare disponibile, memorie, oprirea JVM-ului.System.currentTimeMillis: currentTimeMillis() dă ora curentă în milisecunde de la 1 ianuarie 1970; nanoTime() măsoară precis durate.System: Clasa care leagă programul de sistem: ieșirea standard (out), ieșirea de erori (err), intrarea (in), timpul, variabilele și setările.