Estoy ejecutando JVM 1.5.0 (predeterminado de Mac OS X) y estoy supervisando mi programa Java en el Monitor de actividad. Tengo el siguiente:Java todavía utiliza la memoria del sistema después de la desasignación de objetos y la recolección de basura
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
public class MemoryTest {
public static void memoryUsage() {
System.out.println(
Runtime.getRuntime().totalMemory() -
Runtime.getRuntime().freeMemory()
);
}
public static void main(String[] args) throws IOException {
/* create a list */
ArrayList<Date> list = new ArrayList<Date>();
/* fill it with lots of data */
for (int i = 0; i < 5000000; i++) {
list.add(new Date());
} // systems shows ~164 MB of physical being used
/* clear it */
memoryUsage(); // about 154 MB
list.clear();
list = null;
System.gc();
memoryUsage(); // about 151 KB, garbage collector worked
// system still shows 164 MB of physical being used.
System.out.println("Press enter to end...");
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
br.readLine();
}
}
Así que ¿por qué no la memoria física obtener liberados a pesar de que el recolector de basura parece funcionar bien?
que el sistema operativo tiene un sistema de memoria virtual. La JVM no se aferra a la memoria física. Supongo que realmente quiere decir, ¿por qué la JVM no restringe el rango de direcciones virtuales que utiliza? – Raedwald