На сообщенное freeMemory
может повлиять G C и тот факт, что куча была расширена из-за выделений вашего массива. Также может быть интересно напечатать r.totalMemory
в начале и в конце и сравнить.
Когда JVM запускается, он фактически не выделяет (по умолчанию) целую кучу памяти заранее - она просто «зарезервирована» "и позже" зафиксировано ", если / когда необходимо (в этот момент куча расширяется).
Вы можете попытаться явно установить -Xms
и -Xmx
в одно и то же значение и, скорее всего, получите больше ожидаемых результатов .
Например, используя -Xms8g -Xmx8g
Я получил следующее:
public static void main(String[] args) {
Runtime r = Runtime.getRuntime();
System.out.println(r.freeMemory()); // 8581851136
System.out.println(r.totalMemory()); // 8589934592
System.out.println("Process PID: " + ProcessHandle.current().pid());
String[] arr = new String[100000000];
for (int i = 0; i < 100000000; i++)
arr[i] = new String();
System.out.println(r.freeMemory()); // 5717141504
System.out.println(r.totalMemory()); // 8589934592
}
// compare results when using ONLY -Xmx8g
// 537178112
// 541065216
// 3240407040
// 6104809472
Примечание. Использование -Xms
по-прежнему (обычно) не означает, что память находится в ОЗУ: Java кучи Xms и linux свободной памяти разной