Согласно API
totalMemory()
Возвращает общий объем памяти в виртуальной машине Java. Значение, возвращаемое этим методом, может изменяться со временем в зависимости от среды хоста. Обратите внимание, что объем памяти, необходимый для хранения объекта любого данного типа, может зависеть от реализации.
maxMemory()
Возвращает максимальный объем памяти, который будет пытаться использовать виртуальная машина Java. Если нет внутреннего ограничения, то будет возвращено значение Long.MAX_VALUE.
freeMemory()
Возвращает количество свободной памяти в виртуальной машине Java. Вызов метода gc может привести к увеличению значения, возвращаемого freeMemory.
В ответ на ваш вопрос maxMemory()
возвращает -Xmx
значение.
Вы можете задаться вопросом, почему существует totalMemory () И maxMemory () . Ответ в том, что JVM распределяет память лениво. Допустим, вы запускаете свой процесс Java как таковой:
java -Xms64m -Xmx1024m Foo
Ваш процесс начинается с 64 МБ памяти, и если и когда ему потребуется больше (до 1024 м), он выделит память. totalMemory()
соответствует количеству памяти в настоящее время доступного для виртуальной машины Java для Foo. Если JVM потребуется больше памяти, она будет лениво распределять ее до максимального объема памяти. Если вы работаете с -Xms1024m -Xmx1024m
, значение, которое вы получите, totalMemory()
и maxMemory()
будет равно.
Кроме того, если вы хотите точно рассчитать объем используемой памяти, выполните следующие вычисления:
final long usedMem = totalMemory() - freeMemory();
-Xmx
Значение , кажется, напрямую влияет на первоначальноеmaxMemory()
значение , однако я видел ЗафиксированmaxMemory()
рост на небольшую величину, возможно , ~ 1%, в то время как программа работает.Debug.getNativeHeapFreeSize()
?UseAdaptiveSizePolicy
включены по умолчанию. И кстати:maxMemory()
=Xmx
- размер одного выжившего пространства. Зачем? Потому что в то же время можно использовать только одно место для выживших.Имена и ценности сбивают с толку. Если вы ищете общий объем свободной памяти, вам придется рассчитать это значение самостоятельно. Это не то, что вы получаете от
freeMemory();
.Смотрите следующее руководство:
Общий объем выделенной памяти , это будет равно настроенному значению -Xmx :
Текущая выделенная свободная память , текущее выделенное пространство, готовое для новых объектов. Внимание, это не общая свободная доступная память:
Общая выделенная память , это общее выделенное пространство, зарезервированное для процесса Java:
Используемая память , должна быть рассчитана:
Общая свободная память , должна быть рассчитана:
Картинка может помочь уточнить:
источник
Debug.getMemoryInfo()
?Чтобы лучше это понять, запустите следующую программу (в jdk1.7.x):
Это напечатает параметры jvm и использованную , свободную , общую и максимальную память, доступную в jvm.
источник
Кодифицированная версия всех остальных ответов (на момент написания):
источник
Runtime # totalMemory - память, выделенная JVM до сих пор. Это не обязательно то, что используется или максимум.
Runtime # maxMemory - максимальный объем памяти, который JVM сконфигурировал для использования. Как только ваш процесс достигнет этой суммы, JVM не будет выделять больше, а вместо этого GC будет гораздо чаще.
Runtime # freeMemory - я не уверен, измеряется ли это от максимума или части неиспользованной суммы. Я предполагаю, что это измерение той части общего количества, которая не используется.
источник
Размер кучи JVM может быть увеличен и уменьшен с помощью механизма сборки мусора. Но он не может распределяться по максимальному объему памяти: Runtime.maxMemory. В этом смысл максимальной памяти. Общий объем памяти означает выделенный размер кучи. И свободная память означает доступный объем в общей памяти.
пример) java -Xms20M -Xmn10M -Xmx50M ~~~. Это означает, что jvm должен выделить кучу 20M при запуске (мс). В этом случае общая память составляет 20M. объем свободной памяти составляет 20M. Если требуется больше кучи, JVM выделяет больше, но не может превышать 50M (mx). В случае максимума общий объем памяти составляет 50 МБ, а свободный размер равен 50 МБ. Что касается минимального размера (mn), если куча не используется много, jvm может уменьшить размер кучи до 10M.
Этот механизм для эффективности памяти. Если небольшая Java-программа запускается на огромной куче памяти фиксированного размера, такой объем памяти может быть расточительным.
источник
Вы можете увидеть результаты в формате MB , с делением 1024 x 1024, что равно 1 MB .
источник