Подтвержденный размер - это фактически выделенная память, используемый размер - это размер, используемый для хранения фактических данных (когда используется ~ = зафиксировано, это время для основного ГХ и, возможно, увеличения кучи). Максимальный размер - это жесткий предел, до которого может расти куча - если этого недостаточно, JVM выдает OutOfMemoryError.
Если память зафиксирована, то она определенно может быть использована. Кроме того, единственный случай, когда JVM не сможет выделить больше памяти (в современной ОС), если на аппаратном уровне не хватает виртуальной памяти.
Все эти размеры говорят только о размере области кучи. В JVM есть и другие области памяти (стеки потоков, кэш JIT и т. Д.). Область кучи обычно самая большая, что примерно соответствует занимаемой площади процесса.
Две ноты:
- если зафиксированный размер не умещается в физической памяти, его части будут перенесены в файл подкачки. Это приводит к значительному замедлению работы GC, и в таких случаях вы улучшите производительность приложения, уменьшив размер кучи.
- некоторые операционные системы допускают двойное резервирование памяти - вы можете выделять столько, сколько хотите, если вы не пытаетесь ее использовать (забыл, какая это была операционная система - кто-то меня подставил)