Hazelcast Недостаточно памяти

У нас есть приложение Java, которое обрабатывает 100 тыс. Пакетов в минуту. Пакеты содержат сведения о пользовательских операциях и для одной пользовательской операции. На операцию может быть от 3 до 14 пакетов. Все полученные пакеты содержат уникальные данные для операции, и, к сожалению, операция не имеет идентификатора. Из-за этого мы используем идентификатор пользователя и дату операции, чтобы объединить пакеты, принадлежащие одной операции. Нам гарантируется, что мы получим все пакеты для пользовательской операции максимум за 15 минут. Итак, чтобы объединить все пакеты перед сохранением, мы кэшируем все полученные пакеты на Hazelcast и вставляем пакеты при получении пакетов OPSTART или OPEND. Срок действия пакетов истекает через 20 минут. Однако после 1 часа работы объем кучи Hazelcast превышает 70%.

c.h.internal.diagnostics.HealthMonitor   : [192.168.2.42]:5701 [dev] [3.7.5] processors=4, physical.memory.total=15.7G, physical.memory.free=6.1G, swap.space.total=2.0G, swap.space.free=2.0G, heap.memory.used=3.1G, heap.memory.free=267.1M, heap.memory.total=3.3G, heap.memory.max=3.5G, heap.memory.used/total=92.15%, heap.memory.used/max=88.02%, minor.gc.count=71, minor.gc.time=4628ms, major.gc.count=10, major.gc.time=7186ms, load.process=0.00%, load.system=0.01%, load.systemAverage=0.00%, thread.count=502, thread.peakCount=502, cluster.timeDiff=-121091, event.q.size=0, executor.q.async.size=0, executor.q.client.size=0, executor.q.query.size=0, executor.q.scheduled.size=0, executor.q.io.size=0, executor.q.system.size=0, executor.q.operations.size=0, executor.q.priorityOperation.size=0, operations.completed.count=4722977, executor.q.mapLoad.size=0, executor.q.mapLoadAllKeys.size=0, executor.q.cluster.size=0, executor.q.response.size=0, operations.running.count=0, operations.pending.invocations.percentage=0.00%, operations.pending.invocations.count=50, proxy.count=0, clientEndpoint.count=0, connection.active.count=1, client.connection.count=0, connection.count=1

И примерно через полтора часа вызовы начинают отключаться.

c.h.s.i.o.impl.InvocationMonitor         : [192.168.2.42]:5701 [dev] [3.7.5] Invocations:50 timeouts:0 backup-timeouts:1

Через 2-3 часа после запуска Hazelcast выдает исключение нехватки памяти, и развертывание завершается.

4 ГБ памяти должно быть достаточно для кэшированных данных. Мы не смогли найти причины, по которым Hazelcast генерирует исключение нехватки памяти. Что может быть причиной? Что мы можем сделать, чтобы понять проблему?


person user3645179    schedule 06.08.2017    source источник
comment
Как вы рассчитали потребность, если вы говорите, что 4 ГБ должно хватить? Вы еще не смотрели свалку головы?   -  person noctarius    schedule 06.08.2017
comment
Похоже, что процесс истечения срока действия не удаляет пакеты. Та или другая утечка памяти.   -  person rghome    schedule 06.08.2017


Ответы (1)


Лучший способ определить причину OOME - создать дамп кучи, проанализировать его и посмотреть, как сохраняется память. Вероятно, это будет огромное количество байтовых массивов. Если вы проверите входящие ссылки на эти массивы байтов и объедините их (jprofiler имеет отличную поддержку для этого), очень легко определить цепочку классов, сохраняющих память.

person pveentjer    schedule 10.08.2017