我们可以手动触发完整 GC 或使用堆的某个百分比的参数来触发,这是值得建议的



我正在研究数字图像处理。 当我尝试使用带有加载的更高分辨率图像时,我遇到了很多 OOM 问题。

我正在将这些启动参数与应用程序一起使用

-Xms10240m -Xmx10240m -XX:NewRatio=3 -XX:+PrintFlagsFinal -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

我负担不起增加堆内存的费用。

因此,如果可能,我可以在堆的某个百分比手动触发 Full 吗? 运行手动是建议的操作??

您可以使用调用 System.gc(( 向 JVM 发出请求以触发 GC。 API文档说,这"表明Java虚拟机花费精力回收未使用的对象"。 如果您使用的是 Oracle 的 HotSpot JVM,那么每次调用它时它都会运行一个完整的 GC。

但是,这不太可能(如评论中所述(解决您的问题。 GC 非常擅长回收不再需要的空间,因此您获得的 OOM 异常很可能是由于您的堆只有 1Gb 内存。 您的图像有多大,您尝试同时处理多少图像? 您应该能够做一些简单的数学运算来计算出所需的最小堆大小。

您有以下两个参数:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80

这意味着 JVM 正在等待,直到堆已满 80%,然后再启动并发收集器。 尝试降低此值。 没有保证,但它可能会改善事情。

最新更新