|
Memory Leak?
|
|||
---|---|---|---|
#18+
Всем доброго дня! Прошу помощи в идентификации проблемы. Dev-сервер Wildfly 11, деплоятся несколько инстансов одного EAR-приложения. Редеплои случаются часто только для сборки из ветки master, сновной ветки разработки. Параметры памяти: Код: sql 1.
Хипдамп имеется, загрузил в MAT и ничего не понимаю... В отчете Dominator tree 3 основных строчки: Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 13:06 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
С группировкой по классам ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 13:20 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
WGA...Редеплои случаются часто... AFAIK N1 полно багов с редеплоем, из-за которых память не чистится. Но AFAIK тогда обычно утекает Perm Gen, а не Heap AFAIK N2 Ты смотрешь root объект который имеет ссылку верхнего уровня на не освобожденные объекты. Возможно из-за редиплоя потоки корректно не останавливаются, т.е. см. п. 1. Ну и смотреть, где и как порождаются потоки и как останавливаются ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 13:26 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevWGA...Редеплои случаются часто... AFAIK N1 полно багов с редеплоем, из-за которых память не чистится. Но AFAIK тогда обычно утекает Perm Gen, а не HeapДа, утечки PermGen - штука известная. Сам удивлен. В Java 8 не PermGen, а MetaSpace, но вряд ли это имеет отношение к сути проблемы. Интересное наблюдение. Просматривая отчет Leak Suspects, обнаружил такую проблему. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:06 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Осталось посмотреть кто держит этот массив Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:11 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
ivanraОсталось посмотреть кто держит этот массив Код: plaintext
Код: plaintext 1. 2. 3. 4. 5.
Понять бы, что это за объекты. Вот что выводит outgoing references для ArrayList Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:22 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Очень похоже на сериализованные объекты доменных классов. И похоже, что они остаются в памяти только при редеплое, иначе бы прод бы падал с завидной регулярностью, чего нет в действительности. И у нас не используется кэш 2-го уровня. Откуда же эта зараза берется?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:37 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
WGA, вы можете по отчоту где лежат 1,170,884,208 объектов кликнуть мышкой и посмотреть какой бизнесовый экзепляр там лежит? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:41 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
maytonWGA, вы можете по отчоту где лежат 1,170,884,208 объектов кликнуть мышкой и посмотреть какой бизнесовый экзепляр там лежит?Могу и уже сделал. Только не все древо развернул. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:49 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
WGA, авторТак понимаю, <Java Local> - это thread local треда "default task-4 Thread". Нет, эта таблица хранится в переменной threadLocals, можно посмотреть в jdk. Советую для начала понять, что это за поток. Вызвать для него контекстное меню Java Basics - Thread Details, там будет стек, по которому уже можно догадаться, чем поток занимается ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:49 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
ivanraWGA, авторТак понимаю, <Java Local> - это thread local треда "default task-4 Thread". Нет, эта таблица хранится в переменной threadLocals, можно посмотреть в jdk. Если недостаточно понятно - наименования полей всегда видно, именно такие же, как в исходном коде jdk. Если же мы видим <Java Local> - то это переменная, объявленная в методе, а не поле. Этот метод почему-то никак не может закончиться и освободить переменную. Поэтому смотрим в стек и догадываемся, что метод делает ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:58 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Мне кажется этот зубчатый (jagged) массив порождает не код программиста а какой-то фреймворк. Что за фреймворки у вас используются? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:00 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
ivanraWGA, авторТак понимаю, <Java Local> - это thread local треда "default task-4 Thread". Нет, эта таблица хранится в переменной threadLocals, можно посмотреть в jdk. Советую для начала понять, что это за поток. Вызвать для него контекстное меню Java Basics - Thread Details, там будет стек, по которому уже можно догадаться, чем поток занимаетсяДа, действительно, threadLocals - это отдельное поле. Вот стектрейс треда: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
4. Java Local: All local variables (parameters, objects or methods in thread stacks)Это просто локальные переменные. Все интереснее и интереснее... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:02 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
maytonМне кажется этот зубчатый (jagged) массив порождает не код программиста а какой-то фреймворк. Что за фреймворки у вас используются?JEE7, реализация - Wildfly 11. Используемые технологии из спецификации: 1. JPA - под капотом Hibernate 5.1.10.Final. 2. JMS - ActiveMQ. 3. JAX RS - ReastEasy Но по всем видать, дело в JPA. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:06 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Код: java 1.
Интересно. Строки сериализованы в байты для экономии. В ASCIIZ. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:12 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
WGA, Вот, а теперь смотрим исходники своих методов, которые попали в этот стек, начиная с авторru.septagon.recs.rs.view.CompanyFullView$InnerCashRegisterView.of Судя по всему, там мега запросы к базе. Возможно, во время выполнения произошел редеплой. Как там работает в таких случаях хибернейт не знаю, но к запросам лучше приглядеться ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:12 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
EhCache сбоку где-то прикручен? По eviction-policy еще не успел кеши зачистить и засрал весь хип. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:17 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
у нас дамп памяти вообще был замусорен byte[] массивами от Java JDBC был. Долго и нудно техподдерка Oracle предлагала JDBC проапгрейдить, потом выяснилось, что косяк в нашем коде. Не всегда statement.close вызывали, вот JDBC буфера в памяти и оставались. Самое веселое, что просмоторшики дампов данную память относили к категории "может быть очищена", в результате по версии просмоторшиков дампов вообще был бред 2 Gb heap, из них 1.8 Gb "может быть очищена", но упали с out of memory. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:20 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, да, тут скорее всего ошибка в бизнес коде. Судя по названию метода CompanyFullView можно предположить, что происходил обход дерева подразделений, и что-то пошло не так. Например, цикл. Или проблема n+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:26 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
WGA|- <Java Local> org.postgresql.core.v3.QueryExecutorImpl @ 0x6e27c97b8 | 200 | 1,154,864 |- contextClassLoader org.jboss.modules.ModuleClassLoader @ 0x6e56718d8 | 88 | 141,432 Из-за редеплоя "просрали" classloader, из-за просранного класслоадера не смогли почистить не закрытые сессии/статменты? как предположение ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:27 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
ivanraLeonid Kudryavtsev, да, тут скорее всего ошибка в бизнес коде. Судя по названию метода CompanyFullView можно предположить, что происходил обход дерева подразделений, и что-то пошло не так. Например, цикл. Или проблема n+1 Leonid Kudryavtsev|- contextClassLoader org.jboss.modules.ModuleClassLoader @ 0x6e56718d8 | 88 | 141,432 Если 88 это кол-во копий classLoader'а, то IMHO налицо классический bug с редиплоем Как-то класлоадеров многовато, на мой взгляд. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:29 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
+ где-то в коде не закрываются сессии/стайтменты одно наслоилось на другое, получилось 2 Gb мусора. Если бы открытых "жрущих" сессии/стайтментов не было бы, то рано или поздно уплали бы по классической out of perm gen (или метаспейс). А так, JDBC heap засисрает быстрее, чем классы perm gen IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:33 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, кеш это обычно различные варианты HashMap-а, а тут ArrayList. Целый гиг данных, прочитанный из базы каким-то одним методом. Не так давно мы фильмы такого объема смотрели, для БД это многовато ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:42 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
ivanraкеш это обычно различные варианты HashMap-а, а тут ArrayList. Целый гиг данных, прочитанный из базы каким-то одним методом. Не так давно мы фильмы такого объема смотрели, для БД это многовато Не правда ваша. В наше время программистам 2 Гига засрать - как 2 пальца обосновать ))) Банальные буффера для обмена по сети, для Oracle JDBC thin драйвера по 32-64 MB - запросто! Даже для простейшего "select dummy from dual" - дабы не жалко (при нормальной работе они реиспользуются и очищаются). Здесь же видим 200 НЕ закрытых Statement'ов в 88 не до убитых копиях приложений (88 штук класслоадеров). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:50 |
|
Memory Leak?
|
|||
---|---|---|---|
#18+
mayton Код: java 1.
Интересно. Строки сериализованы в байты для экономии. В ASCIIZ.Это дата/время создания или обновления, есть в каждой сущности. И поля соответствующие типа LocalDateTime, а не строка. maytonEhCache сбоку где-то прикручен? По eviction-policy еще не успел кеши зачистить и засрал весь хип.Нет, кэш второго уровня не подключен. Не дошло до этого. Leonid Kudryavtsevу нас дамп памяти вообще был замусорен byte[] массивами от Java JDBC был. Долго и нудно техподдерка Oracle предлагала JDBC проапгрейдить, потом выяснилось, что косяк в нашем коде. Не всегда statement.close вызывали, вот JDBC буфера в памяти и оставались. Самое веселое, что просмоторшики дампов данную память относили к категории "может быть очищена", в результате по версии просмоторшиков дампов вообще был бред 2 Gb heap, из них 1.8 Gb "может быть очищена", но упали с out of memory.Невысвобождение ресурсов - не наш случай. Почти везде container-managed transaction managment, руками ничего не высвбождается. Специально проверил все бины с ручным управлением - там не используется JPA. А где JDBC просмотрел - все закрывается.ivanraWGA, Вот, а теперь смотрим исходники своих методов, которые попали в этот стек, начиная с авторru.septagon.recs.rs.view.CompanyFullView$InnerCashRegisterView.of Судя по всему, там мега запросы к базе. Возможно, во время выполнения произошел редеплой. Как там работает в таких случаях хибернейт не знаю, но к запросам лучше приглядетьсяДа, очень похоже на мега-граф объектов, тянущихся с главной сущностью Company. А возможно еще и косяки с equals/hashCode имеются. Судя по куче разных объектов типа Currency с одним IDшником (тот самый RUB), возможно equals/hashCode работают некорректно и Hibernate не может понять, что это один и тот же объект и плодит их со страшной силой. Надо порядок в сущностях навести. В общем ушел пытаться воспроизвести проблему в своей песочнице. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:56 |
|
|
start [/forum/topic.php?fid=59&msg=39867354&tid=2121084]: |
0ms |
get settings: |
8ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
62ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
454ms |
get tp. blocked users: |
1ms |
others: | 304ms |
total: | 841ms |
0 / 0 |