Ich versuche, ein Programm zu schreiben, das Speicher einer bestimmten Größe verbrauchen sollte. Ein Problem, das ich mich wundere, ist, dass ich outOfMemory
Ausnahme bekomme, wenn es tatsächlich einen freien Platz im Haufen gibt. HierKann nicht gesamten Speicher verbrauchen
ist der Code:
import java.util.Vector;
import java.lang.*;
public class MemoryEater1 {
public static void main(String[] args) {
try {
long mb = Long.valueOf(args[0]);
Vector v = new Vector();
Runtime rt = Runtime.getRuntime();
while (true) {
if (v.size() > 0) {
if (((long) v.size())*100 < mb) {
System.out.println("total memory: " + rt.totalMemory()/1024/1024);
System.out.println("max memory: " + rt.maxMemory()/1024/1024);
System.out.println("free memory: " + rt.freeMemory()/1024/1024);
System.out.println("Trying to add 100 mb");
//100mb
byte b[] = new byte[104857600];
v.add(b);
}
} else {
//100mb
byte b[] = new byte[104857600];
v.add(b);
System.out.println("Added 100 mb");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Der Befehl zum Starten:
java -Xmx4096m MemoryEater1 3000
Und die Ausgabe:
total memory: 2867
max memory: 3641
free memory: 59
Trying to add 100 mb
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at MemoryEater1.main(MemoryEater1.java:18)
Nun ist der Unterschied zwischen Max-Speicher und Gesamtspeicher ist 774mb, was genug sein sollte, um 100mb mehr zu verbrauchen, aber immer noch gibt es den Fehler und sogar die Maschinenresourcen es sind genug genug:
[[email protected] ~]$ free -m
total used free shared buffers cached
Mem: 15950 3447 12502 0 210 2389
-/+ buffers/cache: 847 15102
Swap: 4031 1759218603 8941
Warum kann das sein?
Haben Sie bemerkt, dass freier Speicher niedriger als 100 MB ist? – Stephan
Wenn Sie große Arrays zuweisen, besteht immer das Risiko, dass die JVM keinen großen zusammenhängenden Block für Sie finden kann, selbst wenn noch Platz übrig sein soll. –
@Stephan Das wäre nur relevant, wenn 'totalMemory' bereits auf' maxMemory' erweitert wurde. –