Отладка приложения Tomcat с возможной утечкой памяти - PullRequest
0 голосов
/ 31 января 2020

Ситуация - приложение API работает на tomcat. Каждый раз, когда я достигаю конечной точки API, использование памяти в 'top' возрастает. После того, как он пройдет ~ 35-40% (примерно дюжина запросов), уровень загрузки переходит с 1% до 40 +%, и приложение перестает отвечать на запросы (и tomcat / container должен быть перезапущен).

Что я сделано:
1. Получил дампы кучи после 1 запроса, затем 5-10 запросов и сравнил их. Увеличение памяти происходит не в моих классах, а в int [] и java .lang. Я не знаю достаточно о java mgmt памяти, чтобы понять эту ситуацию.

Я отслеживал количество / рост потоков с помощью ps -eLf. Ничего не сообщать.

Наблюдал за G C, используя jstat -gc. Вывод выглядит так:

(начало)

  S0C      S1C     S0U    S1U      EC       EU        OC         OU       MC      MU     CCSC   CCSU       YGC   YGCT    FGC    FGCT     GCT
  56832.0 57856.0  0.0   17266.5 157184.0 31716.8   546304.0   35573.4   40104.0 39112.5 4776.0 4474.5      7    1.669   2      0.251    1.921

(конец - до потери контакта)

 S0C     S1C      S0U    S1U      EC       EU        OC         OU       MC       MU      CCSC     CCSU       YGC     YGCT  FGC      FGCT     GCT
 28160.0 27648.0  0.0    0.0   217088.0  4693.9   546304.0   76262.8   404008.0 402586.8 139816.0 139470.6     40    2.595  13      2.859    5.455
  • снова - я не знаю достаточно о java mgmt памяти, чтобы действительно интерпретировать эти значения. Я вижу, что основная сборка мусора не занимает слишком много времени, но определенно происходит.

  • Также пытался (как град) использовать -XX:+UseG1GC. Никакой реальной разницы.

  • В качестве значений использования go wild Ive наблюдал за CPU% / IOWait (через верх). Процессор остается рациональным и не измеримым IOWait. Также посмотрел на top -H с wchan.

Предложения по другим местам искать? Видите что-то очевидное, что я упустил из виду?

Запуск с использованием Java 8. Последняя версия Tomcat rev. CentOS 7. (тестовый запуск в Docker).


дополнительные

Выполнены некоторые измерения с использованием jstat -class, и мне любопытно узнать следующие значения:

(начало )

Loaded  Bytes .   Unloaded  Bytes     Time
121699 122371.1        4     3.4      31.34

(конец)

Loaded  Bytes    Unloaded    Bytes    Time
194495 191761.7        4     3.4      39.20

Это говорит о том, что мое приложение загрузило дополнительные 70К классов и не выгружено? Это проблема?

1 Ответ

1 голос
/ 31 января 2020

Используйте jvisualvm и подключайтесь удаленно (запустив экземпляр tomcat с правильными параметрами jmx https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/jmx_connections.html). Тогда вы сможете увидеть все, включая кучу памяти, и многое, многое другое. В вашем случае у вас может быть нехватка памяти кучи, и G C продолжает пытаться освободить память, но из-за утечки памяти не может этого сделать, и это повторяется бесконечно, процессор очень загружен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...