Есть вопрос о выделении памяти, с которым я хотел бы получить вашу помощь. Мы проанализировали некоторые из наших лучших сервисов и отметили, что они имеют значение RES около 1,8 ГБ, что, насколько я понимаю, означает, что в то время они держали 1,8 ГБ памяти. Что было бы хорошо, если бы мы только запустили их (они, по сути, читают из кеша, выполняют обработку и отправляют в другой кеш), но, видя, как мы все еще видим это после завершения обработки, интенсивно использующей процессор, мы задаемся вопросом: означает, что что-то не так, как мы ожидали.
Мы запускаем программу со следующими параметрами: -Xms256m -Xmx3096m , что, как я понимаю, означает начальный размер кучи 256 и максимальный размер кучи 3096.
Теперь то, что я ожидал бы увидеть , это то, что изначально куча увеличивается по мере необходимости, а затем уменьшается по мере необходимости, когда память освобождается (хотя это может быть моей первой ошибкой). Что мы на самом деле видим с помощью jvisualvm, так это:
- 3 минуты: использованная куча - 1 ГБ, куча
размер 2ГБ
- 5 минут: мы закончили обработку, так
использованная куча резко падает почти
достаточно пшик, размер кучи однако только
падает до 1,5 ГБ
- 7 минут ->: маленькие биты реального времени
периодически обрабатывая, использовал кучу
только между 100-200 МБ или около того,
однако размер кучи остается постоянным
около 1,7 ГБ.
Мой вопрос будет таким: почему моя куча не уменьшилась, как я, возможно, ожидал? Разве это не отнимает у других процессов на коробке с linux ценной памяти, и если да, то как я могу это исправить? Иногда мы видим ошибки нехватки памяти, и, поскольку этим процессам выделяется самый «неожиданный» объем памяти, я подумал, что лучше начать с них.
Cheers,
Дэйв.
(~ прошу прощения за возможное отсутствие понимания по настройке памяти JVM!)