OutOfMemoryException, когда куча наполовину заполнена - PullRequest
0 голосов
/ 30 сентября 2019

Я получаю OutOfMemoryException, хотя кажется, что в куче все еще остается достаточно места.

Мой собственный отчет логов - память VM использовала 22,28 ГБ из 48 Г

логов от -XX:+PrintGCDetails -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1PrintHeapRegions похоже, согласны с тем, что используется только 25G из 48G

[Eden: 0.0B(2448.0M)->0.0B(2448.0M) Survivors: 0.0B->0.0B Heap: 24.9G(48.0G)->24.9G(48.0G)]

 159.360: [G1Ergonomics (Heap Sizing) attempt heap expansion, reason: allocation request failed, allocation request: 48 bytes]
 159.360: [G1Ergonomics (Heap Sizing) expand the heap, requested expansion amount: 16777216 bytes, attempted expansion amount: 16777216 bytes]
 159.360: [G1Ergonomics (Heap Sizing) did not expand the heap, reason: heap already fully expanded]

Проблема, по-видимому, специфична для G1. При использовании алгоритма gc по умолчанию в Java 8 использование памяти становится намного ближе к порогу -mx48G до выброса OutOfMemoryException.

Я использую следующие параметры -XX:+UseG1GC -mx48G

1 Ответ

0 голосов
/ 03 октября 2019

Пробовал тот же вариант использования в Java 11. Он исчерпал память примерно в то же время, но сообщил об использовании памяти на 98%. Это имеет смысл.

Похоже, Java 8 неправильно сообщает об использовании памяти.

...