在我正在处理的应用程序中,我在短时间内将许多沉重的图像加载到我的应用程序中。 在一种特殊情况下,导致应用程序在堆中分配比最大值更多的内存。总是 8 个字节。 然后我从各种线程中得到异常:
Caused by: java.lang.OutOfMemoryError: Java heap space
我的应用程序冻结并且必须终止。
我的虚拟机参数:
-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:MaxGCPauseMillis=100 -XX:+UseG1GC
这不是 RAM 相关的问题,因为我有 32GB 的 RAM,堆最大为 8GB。
我尝试使用
-Xmx4096m
设置不同的最大堆空间,但它仍然分配了 8 个字节太多。
我已经尝试更改 Java 版本(我最初使用 Java 8,将其更改为 Java 17)并且它有点工作 - 在 Java 17 上重现错误要困难得多,它看起来更好地处理内存清理,但是它仍然可以使用较小值的 -Xmx4096m
重现它。
我也尝试过将-XX:MaxHeapFreeRatio=40
更改为30,它也有点工作,但我觉得这可能只是一个临时解决方案,但是我找不到JVM允许分配的堆大于最大值的真正原因.