У нас есть приложение 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 генерирует исключение нехватки памяти. Что может быть причиной? Что мы можем сделать, чтобы понять проблему?