не могу понять такую вот ситуацию:
в нижеприведённом коде вылетает OutOfMemoryError, хотя консоль "говорит", что памяти должно хватать.
[syntax="Java"]public class Memory {
private static String console = "";
private static boolean running = true;
private static String formatMb(long bytes) {
float megaBytes = bytes;
megaBytes /= 1024;
megaBytes /= 1024;
int round = Math.round(megaBytes * 100);
megaBytes = round;
megaBytes /= 100;
return megaBytes + " Mb";
}
public static void main(String[] args) {
synchronized(console) {
console += "Total memory: \t" + formatMb(Runtime.getRuntime().totalMemory()) + "\n";
}
Thread m = new Thread() {
public void run() {
while(running) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(console) {
console += "Memory used: \t" + formatMb(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "\n";
}
}
}
};
m.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
int size = 20000*20000;
new java.awt.image.DataBufferInt(size);
} catch (OutOfMemoryError e) {
synchronized(console) {
console += e + "\n";
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
running = false;
synchronized(console) {
System.out.println(console);
}
}
}
[/syntax]
Программка запускается через:
Код: Выделить всё
java -Xms1G -Xmx1G Memory
Вывод используемой памяти на консоль происходит довольно часто и прирост 1-2 Мб максимум, т.о. перед тем, как вылетел Exception используемая память была 24 Мб.Total memory: 1016.13 Mb
Memory used: 2.52 Mb
Memory used: 2.52 Mb
...
Memory used: 20.45 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 21.73 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 23.05 Mb
Memory used: 24.33 Mb
Memory used: 24.33 Mb
java.lang.OutOfMemoryError: Java heap space
Memory used: 2.69 Mb
Memory used: 2.69 Mb
Memory used: 2.69 Mb
...
Какая бы ни была погрешность, это на порядок меньше, чем доступная память.
И вопрос, который меня в связи с этим волнует, звучит так: Каким образом может вылетать OutOfMemoryError, если памяти достаточно?
Быть может я не понимаю сути этого Эксепшна, тогда обьясните, плз, кто знает.
В общем я в полной растеряности ...