Runtime.totalMemory în Java

totalMemory() dă memoria rezervată acum de JVM, freeMemory() cât din ea este liberă; diferența este memoria folosită.

Sintaxă
long totalMemory()
long freeMemory()
long maxMemory()   // Java 1.4

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.