Spring Data JPA Meta JpaMetamodelMappingContext Потребление памяти - PullRequest
0 голосов
/ 18 сентября 2018

Приложение My Spring Data JPA / Hibernate при запуске потребляет более 2 ГБ памяти, при этом ни один пользователь не ударит по нему. Я использую Hazelcast в качестве кэша второго уровня, но у меня была та же проблема, когда я также использовал ehCache, так что это, вероятно, не является причиной проблемы.

Я запустил профиль с дампом кучи в Visual VM и вижу, где большая часть памяти используется JpaMetamodelMappingContext и вторичной тонной объектов Map. Мне просто нужна помощь в расшифровке того, что я вижу, и если это действительно проблема. У меня есть сто классов в модели, так что это может быть нормально, но у меня нет точки отсчета. Это кажется немного чрезмерным.

После загрузки 100 одновременных пользователей потребление памяти увеличивается до 6-7 ГБ. Это вполне нормально для объема данных, которые я перемещаю и кеширую, но я чувствую, что если бы я мог уменьшить исходную память, у меня было бы гораздо больше возможностей для роста.

Screenshot of Visual VM

enter image description here

1 Ответ

0 голосов
/ 30 сентября 2018

Я не думаю, что у вас есть проблема здесь. Вместо этого я думаю, что вы неверно истолковываете данные, которые вы просматриваете.

Обратите внимание, что на диаграмме пространства кучи отображаются два числа: Размер кучи и Использованная куча

Размер кучи (оранжевый) - это объем памяти, доступный JVM для кучи. Это означает, что это сумма, которую JVM запросила в определенный момент у ОС.

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

Низкие точки этой кривой - это объем памяти, который вы на самом деле используете. Кажется, это около 250 МБ, что мне не очень нравится, особенно когда вы говорите, что общее потребление 6-7 ГБ при реальной работе звучит для вас разумно.

Некоторые другие наблюдения:

Как загрузка процессора, так и куча быстро растут / сильно колеблются во время запуска. Этого следовало ожидать, потому что анализ хранилищ и сущностей происходит в это время.

JpaMetamodelMappingContext s - размер около 23 МБ. Опять же, хороший кусок памяти, но не такой большой. Это включает в себя материал, на который он ссылается, который является почти исключительно метаданными из реализации JPA, как вы можете легко увидеть, когда вы посмотрите на его источник .

...