Вопрос по – tomcat - их классы из предыдущих прогонов все еще загружаются в память

4

когда остановите мой проект, кот скажет:

Следующие веб-приложения были остановлены (перезагружены, отменены), но их классы из предыдущих запусков все еще загружен в память, что приводит к утечке памяти (для подтверждения используйте профилировщик).

Где мы находим то, какие классы остались в памяти?

Помогите мне, пожалуйста .

Ваш Ответ

2   ответа
10

jmap -histo который покажет вам загруженные классы.

Например:

jmap -histo[:live] <pid>
    to connect to running process and print histogram of java object heap
    if the "live" suboption is specified, only count live objects

Example: jmap -dump:live,format=b,file=heap.bin <pid>

Другой способ - включить загрузку отладочной информации и выполнить некоторые сценарии, чтобы определить, что осталось загруженным.

jmap - это инструмент командной строки, вы не можете получить к нему доступ через веб-приложение. pid - это ваш идентификатор процесса Java.
спасибо, я запустил jmap -histo. Как понять, почему мой класс остался в памяти? Ali Farozi
Jmap поставляется с вашим JDK, вам не нужно ничего скачивать. Что касается подробной загрузки, добавьте-verbose:class вариант вашей команды Java.
@ mindas, что такое книга jmap -histo? как это скачать? и как включить загрузку отладочной информации? Ali Farozi
спасибо, как использовать jmap для веб-приложения в tomcat? что такое & lt; pid & gt; ? Ali Farozi
8

обычно в памяти есть что-то, что является «закреплением». WebappClassLoader (загрузчик классов, который отвечает за загрузку классов для экземпляра вашего веб-приложения) в память. Если вы повторно загрузите свое веб-приложение несколько раз, вы сможете увидеть, как количество экземпляров WebappClassLoader увеличивается на 1 для каждой выполняемой вами перезагрузки. Это обычноnot утечка в Tomcat, но вместо этого утечка либо непосредственно в коде вашего веб-приложения, либо утечка в используемой вами библиотеке, либо утечка, вызванная несколькими конкретными вызовами Java API, которые делают глупости.

Во-первых, пожалуйста, прочитайте это:http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf, Это отличное описание того, что именно происходит.

Во-вторых, используйте профилировщик, чтобы определить, что содержит ссылки на объекты, загруженные вашим WebappClassLoader. Много раз, просто используя ServletContextListener, можно очистить эти ссылки, когда веб-приложение остановлено.

В-третьих, если вы обнаружите утечку из библиотеки, которую вы используете, сообщите им об этом. Если вы обнаружите утечку из класса в JRE, посмотрите на варианты использования JreMemoryLeakPreventionListener:http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JRE_Memory_Leak_Prevention_Listener_-_org.apache.catalina.core.JreMemoryLeakPreventionListener, Если вы ничего не нашли, пожалуйста, обращайтесь к пользователям Tomcat & apos; и дайте нам знать, чего не хватает: мы добавим это.

Вы имеете в виду «Профилировщик»? Профилировщик - это инструмент, который позволяет вам проверять работающее приложение - обычно это процессор или использование памяти (или и то, и другое). Есть много профилировщиков, доступных для Java. Просто Google для & quot; Java Profiler & quot ;. Я использую YourKit Java Profiler, потому что они дают мне бесплатную лицензию из-за моей связи с ASF.
Я не понял, как я делаю свой профиль? Ali Farozi
Если вы спрашиваете, как использовать профилировщик для исследования этих проблем, прочитайте страницу 11 по ссылке выше.
спасибо, как настроить профилировщик, чтобы определить, что содержит ссылки на объекты, загруженные вашим WebappClassLoader? Ali Farozi

Похожие вопросы