2017-08-23 45 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%。嘗試降低這一點。沒有保證,但它可能會改善事情。