Утечки памяти можно устранить, выполнив следующие 3 простых шага:
Шаг 1: Захват дампа кучи на ранней стадии
Запустите ваше приложение. Пусть это займет 10 минут реального трафика. В этот момент захватывает куча дампов. Кучи дамп в основном снимок вашей памяти. Он содержит все объекты, которые находятся в памяти, значения, хранящиеся в этих объектах, входящие и исходящие ссылки на эти объекты. Вы можете перехватить дамп кучи, используя следующую команду:
jmap -dump:format=b,file=<file-path> <pid>
where
pid: is the Java Process Id, whose heap dump should be captured
file-path: is the file path where heap dump will be written in to.
Если вы не хотите использовать jmap для захвата дампов кучи, вот несколько других вариантов захвата дампов кучи .
Шаг 2: Захват дампа кучи до сбоя приложения
После выполнения шага 1, позвольте приложению работать. Перед сбоем приложения сделайте еще один дамп кучи еще раз. Часто бывает сложно собрать дамп кучи до его сбоя, потому что мы не знаем, когда произойдет сбой приложения. Это через 30 минут, 3 часа, 3 дня? Таким образом, лучше всего запускать ваше приложение со следующим свойством JVM:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-path>
file-path: is the file path where heap dump will be written in to.
Это свойство будет запускать дамп кучи прямо при возникновении OutOfMemoryError.
Шаг 3: Анализ дампов кучи
Объекты, которые вызывают утечки памяти, растут в течение периода. Если вы можете идентифицировать объекты, размер которых вырос между дампами кучи, захваченными на шаге 1 и шаге 2, то это те объекты, которые вызывают утечку памяти.
Вы можете использовать для этой цели инструмент для анализа дампа кучи, например HeapHero.io , Eclipse MAT . Когда вы загружаете дампы кучи в любой из инструментов, появляется раздел, сообщающий о самых больших объектах в памяти. Сравните этот раздел между дампом кучи, записанным на шаге 1 и шагом 2. Если вы заметили какой-либо ненормальный рост объектов, то именно они вызывают утечку памяти в вашем приложении.