Когда вы добавляете
-Xmx????m
в командной строке, JVM дает вам кучу, которая близка к этому значению, но может быть отключена до 14%. JVM может дать вам гораздо более близкую к тому, что вы хотите, но только путем проб и ошибок.
System.out.println(Runtime.getRuntime().maxMemory());
печатает
-Xmx1000m -> 932184064
-Xmx1024m -Xmx1g -> 954728448
-Xmx1072m -> 999292928
-Xmx1073m -> 1001390080
Я запускаю обновление HotSpot Java 8 5.
Очевидно, что куча может быть чем-то выше 1000000000
, но почему это -Xmx1073m
вместо -Xmx1000m
?
BTW 1g
== 1024m
, который предполагает, что 1g
должен быть 1024 ^ 3, что на 7% выше 1000 ^ 3, но вы получаете что-то на 7% ниже 1000 ^ 3.
Из-за чего так много говорит о том, что мне не хватает чего-то фундаментального в том, как работает куча. Если бы я попросил -Xmx1000m, и это было 1001390080
, мне было бы все равно, я бы предположил, что есть некоторое распределение, которое нужно придерживаться, но чтобы дать вам 932184064
, мне кажется, что куча сложнее, чем я могу представьте себе.
EDIT Я обнаружил, что
-Xmx1152m gives 1073741824 which is exactly 1024^3
так что кажется, что он дает мне ровно на 128 МБ меньше, чем я просил в этом случае cf maxMemory().
BTW 128 - мой любимый номер. Сегодня я был на конференции по номеру улицы 128
, и оратор цитировал книгу со страницы 128
;)