我得到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
答案 0 :(得分:0)
在Java 11中尝试了相同的用例。它几乎同时耗尽了内存,但报告的内存利用率为98%。那是有道理的。
似乎Java 8错误地报告了内存利用率。