堆半满时OutOfMemoryException

时间:2019-09-30 18:06:46

标签: java memory garbage-collection

我得到OutOfMemoryException,但堆似乎还有足够的空间。

我自己的日志报告-VM内存已使用48G中的22.28G

-XX:+PrintGCDetails -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1PrintHeapRegions的日志似乎同意48G中仅使用25G

[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。在Java 8上使用默认的gc算法时,在抛出-mx48G之前,内存利用率非常接近OutOfMemoryException阈值。

我正在使用以下参数 -XX:+UseG1GC -mx48G

1 个答案:

答案 0 :(得分:0)

在Java 11中尝试了相同的用例。它几乎同时耗尽了内存,但报告的内存利用率为98%。那是有道理的。

似乎Java 8错误地报告了内存利用率。