Общее поведение кучи для Wildfly или утечка памяти приложения? - PullRequest
0 голосов
/ 22 апреля 2019

Мы запускаем наше приложение в Wildfly 14.0.1, с -Xmx 4096, работающее с OpenJDK 11.0.2. Я использовал VisualVM 1.4.2 для мониторинга нашей кучи, так как ранее у нас были исключения OOM (потому что наш -Xmx был только 512, что было невероятно плохо).

Несмотря на то, что сейчас мы располагаем достаточным распределением памяти, у нас больше не происходит исключений OOM, и даже при большом количестве клиентов и обработки мы не приближаемся к -Xmx4096 (серверы имеют 16 ГБ, поэтому память не проблема), я вижу странное поведение кучи, которое я не могу понять, откуда оно.

Используя VisualVM, Eclipse MemoryAnalyzer, а также heaphero.io, я получаю сводки, подобные следующим:

Всего байт: 460,447,623

Всего классов: 35 708

Всего экземпляров: 2 660 155

Загрузчики классов: 1 087

GC Корни: 4200

Количество объектов, ожидающих завершения: 0

Однако, наблюдая за монитором кучи, я вижу, что использованная куча за 4-минутный период времени увеличивается примерно на 450 МБ, прежде чем ГХ запускается и опускается обратно только для повторного всплеска. Вот изображение: image of the memory spikes

Это когда клиенты не подключены и в нашем приложении ничего не происходит. Мы используем Apache File IO для мониторинга удаленных каталогов, у нас есть темы JMS и т. Д., Поэтому приложение не совсем бездействует, но ведется нулевое ведение журнала и все такое.

Моими самыми большими объектами являются хорошо известные io.netty.buffer.PoolChunk, которые в дампах кучи занимают около 60% моего использования памяти, общий объем все еще составляет около 460 МБ, поэтому я не понимаю, почему монитор кучи собирается от ~ 425 МБ до ~ 900 МБ несколько раз, и независимо от того, где я делаю свои снимки, я не вижу большого увеличения количества объектов или использования памяти.

Я просто вижу разрыв между монитором кучи и анализом .hprof. Таким образом, нет способа определить причину, по которой куча достигает максимума в 900 МБ.

Мой вопрос заключается в том, ожидаются ли эти пики кучи при работе в Wildfly, или в нашем приложении есть что-то, что раскручивает кучу объектов, которые затем получают GC'd? При создании отчета о компонентах объекты в структуре пакета нашего приложения составляют чрезвычайно малый объем дампа. Что нас не очищает, мы легко могли бы звонить, не закрываясь соответствующим образом и т. Д.

...