Точное состояние зафиксированной памяти в Java - PullRequest
12 голосов
/ 16 октября 2008

Мне интересно, что именно означает «выделенная» память, когда значение запрашивается из класса MemoryUsage. Этот класс объясняет это как «зафиксированный представляет объем памяти (в байтах), который гарантированно будет доступен для использования виртуальной машиной Java». Означает ли это, что память используется процессом jvm и НЕ доступна другим процессам, пока не будет освобожден процессом java, или это означает, что процесс java будет успешным, если он попытается выделить до этого объема памяти ? Я понимаю, что это может зависеть от реализации, но меня интересует только горячая точка.

Ответы [ 2 ]

21 голосов
/ 16 октября 2008

Подтвержденный размер - это фактически выделенная память, используемый размер - это размер, используемый для хранения фактических данных (когда используется ~ = зафиксировано, это время для основного ГХ и, возможно, увеличения кучи). Максимальный размер - это жесткий предел, до которого может расти куча - если этого недостаточно, JVM выдает OutOfMemoryError.

Если память зафиксирована, то она определенно может быть использована. Кроме того, единственный случай, когда JVM не сможет выделить больше памяти (в современной ОС), если на аппаратном уровне не хватает виртуальной памяти.

Все эти размеры говорят только о размере области кучи. В JVM есть и другие области памяти (стеки потоков, кэш JIT и т. Д.). Область кучи обычно самая большая, что примерно соответствует занимаемой площади процесса.

Две ноты:

  • если зафиксированный размер не умещается в физической памяти, его части будут перенесены в файл подкачки. Это приводит к значительному замедлению работы GC, и в таких случаях вы улучшите производительность приложения, уменьшив размер кучи.
  • некоторые операционные системы допускают двойное резервирование памяти - вы можете выделять столько, сколько хотите, если вы не пытаетесь ее использовать (забыл, какая это была операционная система - кто-то меня подставил)
2 голосов
/ 16 октября 2008

«Означает ли это, что память используется процессом jvm и НЕ доступна другим процессам» будет правильным. Таким образом, он меньше (или равен) объему памяти, который ОС видит как занятый процессом JVM.

http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html (извините, якорей нет ссылки на).

...