2017-08-23 22 views
0

我对数字图像处理工作。当我尝试更高分辨率的图像加载时,我得到很多OOM问题。不能手动或参数触发全在GC堆的一些百分比,是耳根

我使用与应用

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

我不能负担得起增加的堆内存这些启动参数。

所以,我可以完全手动触发堆在一定比例,如果可能的话。 运行手册是耳根操作??

+3

垃圾收集不会帮你做OOM .. – NickL

+3

GC总是在抛出“OOM”之前完成的,所以你只是没有足够的内存。要么获得更多的内存,要么修改程序以使用更少的内存。 – Kayaman

回答

1

您可以使用对System.gc()的调用向JVM发出触发GC的请求。 API文档说,这“表明Java虚拟机了一些努力回收未使用的对象”。如果您正在使用Oracle的热点JVM那么它会在您每次调用它运行一个完整的GC。

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

您有以下两个参数:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 

这意味着JVM是等到堆启动并发收集满前80%。尝试降低这一点。没有保证,但它可能会改善事情。