Я делаю анализ управления памятью для своего веб-приложения Java,
Перед запуском моего кота свободная память составляла около 595 МБ. После запуска сервера объем свободной памяти достигал 151 МБ. Когда я делал дамп кучи, объекты занимали 262 МБ.
Так займет ли только Tomcat оставшиеся 181 МБ?
Другой вопрос: я провел нагрузочный тест с 500 пользователями. Свободная память составляет 8 МБ. Когда я делал здесь дамп кучи, было около 265 МБ. Итак, свободное место с 151 МБ уменьшилось до 8 МБ, в чем может быть причина
Во-первых, прочтите и поймите http://www.linuxatemyram.com/ почему количество "свободной" памяти намного ниже, чем вы думаете.
Во-вторых, Java выделяет всю свою кучу заранее из операционной системы, хотя она не касается страниц и не загрязняет их до тех пор, пока они не будут фактически использованы. Это дает вам лучший результат, например:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9521 pjc 17 0 1288m 524m 25m S 0.0 13.3 58:31.92 java
Это я запускаю Eclipse; столбец VIRT показывает, что Java, вероятно, имеет максимальный размер кучи 1024 МБ; Кроме того, есть библиотеки и память, выделенная для хранения скомпилированной Java. Однако в настоящее время в оперативной памяти находится только 524 МБ.
Ваш дамп кучи - лучший показатель того, сколько памяти использует ваше приложение - при условии, что это после того, как оно выполнило сборку мусора.
Использовать пси-зонд чтобы увидеть, что происходит в JVM. Или VisualVM, но пси-зонд доступнее.
Операционная система шустрая, а не тупая. Он понимает, что свободная память - это потраченная впустую память, не лучше, чем память, которой вообще нет в системе. Это не похоже на то, что если ваш компьютер с 4 ГБ сегодня использует только 3 ГБ, вы можете использовать 5 ГБ завтра.
Таким образом, он хранит то, что может быть использовано в оперативной памяти. Если позже он сможет использовать это, это победа в производительности. Удивительно, но если позже он не сможет его использовать, он по-прежнему выигрыш в производительности, потому что, если бы он сделал его бесплатным, ему просто пришлось бы снова использовать его. (Для этого потребуется две операции, тогда как переключение напрямую с одного использования на другое - всего одна операция.)
Современные операционные системы освобождают только небольшой объем памяти и только тогда, когда у них нет выбора.