为什么 Java 应用分配的堆比 max 多?

问题描述 投票:0回答:0

在我正在处理的应用程序中,我在短时间内将许多沉重的图像加载到我的应用程序中。 在一种特殊情况下,导致应用程序在堆中分配比最大值更多的内存。总是 8 个字节。 Heap monitor from VisualVM 然后我从各种线程中得到异常:

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允许分配的堆大于最大值的真正原因.

java jvm out-of-memory heap-memory
© www.soinside.com 2019 - 2024. All rights reserved.