Это SO answer разъясняет несколько вещей о флагом JVM -Xmx
. Попытка эксперимента я сделал следующее:-Xmx жесткий предел?
import java.util.List;
import java.util.ArrayList;
public class FooMain {
private static String memoryMsg() {
return String.format("%s. %s. %s"
, String.format("total memory is: [%d]",Runtime.getRuntime().totalMemory())
, String.format("free memory is: [%d]",Runtime.getRuntime().freeMemory())
, String.format("max memory is: [%d]",Runtime.getRuntime().maxMemory()));
}
public static void main(String args[]) {
String msg = null;
try {
System.out.println(memoryMsg());
List<Object> xs = new ArrayList<>();
int i = 0 ;
while (true) {
xs.add(new byte[1000]);
msg = String.format("%d 1k arrays added.\n%s.\n"
, ++i
, memoryMsg());
}
} finally {
System.out.printf(msg);
}
}
}
Собирать с javac FooMain.java
. Когда я запускаю его с максимальным размером кучи 5 миллионов байт я получаю:
java -Xmx5000000 FooMain
total memory is: [5242880]. free memory is: [4901096]. max memory is: [5767168]
4878 1k arrays added.
total memory is: [5767168]. free memory is: [543288]. max memory is: [5767168].
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.String.toCharArray(String.java:2748)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:3048)
at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2744)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2702)
at java.util.Formatter.format(Formatter.java:2488)
at java.util.Formatter.format(Formatter.java:2423)
at java.lang.String.format(String.java:2792)
at FooMain.memoryMsg(FooMain.java:7)
at FooMain.main(FooMain.java:21)
Хотя эти цифры достаточно близки, они не кажутся очень точно (с исключением total memory
в конце достигающего точноmax memory
). В частности, 5368 массивов по 1000 байт должны занимать более 5000000 или даже 5242880 байт. Как следует понимать эти цифры?
Это Java я использую:
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Server VM (build 24.80-b11, mixed mode)
Может быть, сбор мусора заработал за это время ... –
@RobertNiestroj не может, так как все ссылки хранятся –
@RobertNiestroj почему нужно что-нибудь GCed? Я добавляю массивы в «Список». Никакая ссылка не выходит за рамки. –