Outofmemoryerror gc overhead limit exceeded при параметрах -xmx8192m -xx-usegcoverheadlimit - stack
jUnit тести працюють з великими обсягами даних, зокрема, дана помилка виникає, коли зчитуємо дані з бази в об'єкт.
ОЗУ - 16 Гб, 4 віртуальних процесора
коли виникла помилка
то я додав параметр -XX: -UseGCOverheadLimit але отримав наступну помилку:
всі параметри JVM -Xmx8192M -XX: -UseGCOverheadLimit
в момент появи помилки були такі параметри системи: ОЗУ стабільно на 46% (7400Мб), ЦПУ 77% -82% (82% в момент появи помилки)
підкажіть, як виправити цю проблему?
- java.lang.OutOfMemoryError: GC overhead limit exceeded
Дана помилка може виникнути як при переповненні першої, так і другої областей. Пов'язана вона з тим, що пам'яті залишилося мало і GC постійно працює, намагаючись вивільнити трохи місця. Дану помилку можна відключити за допомогою параметра -XX: -UseGCOverheadLimit, але, звичайно ж, її треба не відключати, а або вирішувати проблему витоку пам'яті, або виділяти більше обсягу, або змінювати налаштування GC.
відповідь
String об'єкт занадто багато важить. а у мене там дуже багато стрінгів. Для прикладу, порахували файл, який важить 250 МБ, має 1600 символів в рядку і 220 000 строк. Заповнюю в ArrayList
Рішення: збільшив пам'ять до 14Гб. тепер проблема в тому, що 6Гбайтний об'єкт не поміщається в купі, треба думати щось інше і пожертвувати часом виконання тесту.
Почни з основ для кращого розуміння помилки.
JVM має дві області пам'яті: Heap Memory і Non-Heap Memory.
- Heap Memory - зберігає об'єкти;
- Non-Heap Memory - зберігає параметри методів, примітивні типи і т.д.

У Вашому випадку відбувається переповнення Heap Memory. тому дуже багато створюється об'єктів, які не вміщаються в Heap Memory. Вирішити проблему можна збільшивши Heap Memory (ключ -Xmx), що не завжди допомагає, тому що обсяг даних може бути більше ніж доступно ОЗУ, тому краще реалізувати обробку даних з БД порційно, тобто вивантажувати частина даних, щоб об'єкти помістилися в пам'яті, потім вбивати їх (привласнювати null. щоб GC розвантажити), замет наступну частину і т.д.
P.S. Варто розуміти, що Heap не дорівнює ОЗУ. Heap - це тільки зарезервована пам'ять для JVM, більше даного резерву JVM використовувати не може навіть, якщо ОЗУ в надлишку.