Java OOM в проекте с высокой нагрузкой

У меня проблема с OOM Exception в многопоточном Java-проекте с высокой нагрузкой.
Я ценю любую помощь, которую вы можете оказать.

Delails: Проект построен на Java+Mysql в качестве хранилища.

Нет никаких свидетельств использования дополнительной оперативной памяти в момент сбоя приложения (никаких скачков в каком-либо инструменте мониторинга). Свободной памяти много
Процессор и ввод / вывод тоже в порядке.
Инструмент Jstack не обнаружил никаких блокировок потоков.
Нет медленных или ошибок журналов в Mysql.
В hs_err вы можете видеть состояние thread_blocked, но я не нашел никакой причины для этого.
Java запускает аргументы, системные ограничения, свободную память вы можете увидеть ниже.

Вот ошибка в hs_err_filepart (полный файл прилагается):

Недостаточно памяти для продолжения среды выполнения Java. При выделении собственной памяти (mmap) не удалось сопоставить 1633681408 байт для фиксации зарезервированной памяти.
Возможные причины:
В системе недостаточно физической памяти или пространства подкачки. В 32-разрядном режиме достигнут предел размера процесса.
Возможные решения:
Уменьшить нагрузку на память в системе
Увеличить физическую память или пространство подкачки
Проверьте, заполнен ли резервный магазин подкачки
Используйте 64-битную Java на 64-битной ОС
Уменьшить размер кучи Java (-Xmx/-Xms)
Уменьшить количество потоков Java
Уменьшить размеры стека потоков Java (-Xss)
Установите больший кэш кода с помощью -XX:ReservedCodeCacheSize= Этот выходной файл может быть усеченным или неполным.

Ошибка нехватки памяти (os_linux.cpp:2627), pid=11980, tid=0x00007f27148c8700

Версия JRE: среда выполнения Java(TM) SE (8.0_92-b14) (сборка 1.8.0_92-b14)
Java VM: виртуальная машина 64-разрядного сервера Java HotSpot(TM) (сжатый режим linux-amd64 в смешанном режиме 25.92-b14)
Не удалось записать дамп ядра. Основные дампы были отключены. Чтобы включить дамп ядра, попробуйте "ulimit -c unlimited" перед повторным запуском Java

--------------- НИТЬ ---------------

Текущий поток (0x00007f27883c5800): VMThread [стек: 0x00007f27147c8000,0x00007f27148c9000] [id=12005]

Стек: [0x00007f27147c8000,0x00007f27148c9000], sp=0x00007f27148c7160, свободное пространство =1020k
Собственные кадры: (J= скомпилированный код Java, j= интерпретированный, Vv= код VM, C= собственный код)
V [libjvm.so + 0xabd65a] VMError:: report_and_die () + 0x2ba
V [libjvm.so + 0x4fb4db] report_vm_out_of_memory (char const *, int, unsigned long, VMErrorType, char const *) + 0x8b
V [libjvm.so + 0x91d713] os:: Linux:: commit_memory_impl (char *, unsigned long, bool) + 0x103
V [libjvm.so + 0x91dc69] os:: pd_commit_memory (char *, без знака long, без знака long, bool) + 0x29
V [libjvm.so + 0x917f6a] os:: commit_memory (char *, unsigned long, unsigned long, bool) + 0x2a
V [libjvm.so + 0x98c343] PSVirtualSpace:: expand_by (без знака long) + 0x53
V [libjvm.so + 0x98d748] PSYoungGen:: resize_generation (длинная без знака, длинная без знака) + 0xf8
V [libjvm.so + 0x98c8a2] PSYoungGen:: resize (длинная без знака, длинная без знака) + 0x22
V [libjvm.so + 0x989b7b] PSScavenge:: invoke_no_policy () + 0xf3b
V [libjvm.so + 0x98a301] PSScavenge:: invoke () + 0x41
V [libjvm.so + 0x941410] ParallelScavengeHeap:: failed_mem_allocate (unsigned long) + 0x70
V [libjvm.so + 0xabf077] VM_ParallelGCFailedAllocation:: doit () + 0x97
V [libjvm.so + 0xac6aa5] VM_Operation::valu () + 0x55
V [libjvm.so + 0xac4e7a] VMThread::valu_operation (VM_Operation *) + 0xba
V [libjvm.so + 0xac51fe] VMThread:: loop () + 0x1ce
V [libjvm.so + 0xac5670] VMThread:: run () + 0x70
V [libjvm.so + 0x91fad8] java_start (Тема *) + 0x108

VM_Operation (0x00007f22963f34e0): ParallelGCFailedAllocation, режим: безопасная точка, запрошено потоком 0x00007f25e8105000

--------------- ПРОЦЕСС ---------------

Потоки Java: ( => текущий поток)
0x00007f25a8052800 JavaThread "pool-27-thread-32" [_thread_blocked, id = 26278, стек (0x00007f2147523000,0x00007f2147624000)]
0x00007f24dc07f000 JavaThread "pool-33-thread-55" [_thread_blocked, id = 26277, стек (0x00007f2147624000,0x00007f2147725000)]
0x00007f25bc06b800 JavaThread "pool-28-thread-48" [_thread_blocked, id = 26272, стек (0x00007f2147725000,0x00007f2147826000)]
0x00007f2568060000 JavaThread "pool-24-thread-39" [_thread_blocked, id = 26267, стек (0x00007f2147826000,0x00007f2147927000)]
0x00007f25bc06a000 JavaThread "pool-28-thread-47" [_thread_blocked, id = 26262, стек (0x00007f2147927000,0x00007f2147a28000)]

jvm_args: -Xmx16G -XX:ReservedCodeCacheSize= 256M -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath = / opt / DDT / CPA -XX: -OmitStackTraceInFastThrow

Объем памяти:
бесплатно -m
общее количество использованных свободных общих буферов в кеше
Память: 64298 37022 27275 5 593 9466
- / + буферы / кэш: 26962 37336
Своп: 15847 957 14889

Системные ограничения:

ulimit -a
основной размер файла (блоки, -c) 0
размер сегмента данных (в килобайтах, -d) неограничен
приоритет планирования (-e) 0
размер файла (блоков, -f) неограничен
ожидающие сигналы (-i) 256455
макс заблокированная память (кбайт, -l) 64
максимальный объем памяти (кбайт, -м) неограничен
открыть файлы (-n) 64000
размер трубы (512 байт, -p) 8
Очереди сообщений POSIX (байты, -q) 819200
приоритет в реальном времени (-r) 0
размер стека (в килобайтах, -s) 8192
время процессора (секунды, -t) не ограничено
максимальное количество пользовательских процессов (-u) 256455
виртуальная память (кбайт, -v) не ограничена
файловые блокировки (-x) не ограничены

1 ответ

Я думаю, что вы можете столкнуться с проблемой ниже с 64-битной виртуальной машиной и сжатыми OOPS:

https://bugs.openjdk.java.net/browse/JDK-8187709

https://blogs.oracle.com/poonam/running-on-a-64bit-platform-and-still-running-out-of-memory

Другие вопросы по тегам