2010-03-19 66 views
2

在將大文件寫入servletOutputStream時,出現java.lang.outOfMemoryError異常。 默認情況下,每個響應都使用ehcache.constructs.web.filter Object進行包裝,以進行GZIP壓縮。根據日誌,在Filter對象中拋出異常。 有沒有辦法增加可用內存,這樣outOfMemoryError異常不會發生?過濾器中的Java OutOfMemory錯誤

+1

你使用的是tomcat嗎? – Bozho 2010-03-19 14:03:00

回答

1

您需要選擇「-Xmx1024m」添加到它運行你的servlet CONTA的java命令核能研究所。 (用任何你喜歡的堆大小代替1024m;這意味着1024兆字節)。如果你使用的是Tomcat,那麼這意味着你在環境變量CATALINA_OPTS中設置它。你的服務器配置會有所不同

但是,問題是在內存中緩衝這樣一個大文件。這是浪費。試試這個壓縮過濾器,它不緩衝這樣:

http://sourceforge.net/projects/pjl-comp-filter/

+0

該文件大小爲17MB。它應該引起問題嗎? 我正在使用JBOSS服務器。 – 2010-03-19 10:00:29

+0

我可以想象,在所有中間數據結構中取50 + MB的堆。而且,如果你的堆剩下大約64MB的默認值,是的,這是一個問題。 雖然你可以使堆更大,但我真的認爲最好使用不需要將文件加載到內存中的過濾器。這不應該是必要的,上面的過濾器不這樣做。 – 2010-03-19 11:20:28

0

使用-Xmx Java的如下圖所示

java -Xms256m -Xmx512m com.test.MyMain 

X毫秒命令行選項代表內存分配的下端與XMX代表內存分配的上端

0

設置以下JVM選項,你的servlet容器-Xmx256m -Xms128m(Tomcat中它是catalina.sh/catalina.bat

0

不要忘記可能需要增加你的PermGen大小:

-XX:PermSize=64m -XX:MaxPermSize=256m 

也不要請確保您高效地流出文件。輸出或輸入流管道中可能會有不必要的大緩衝。

+0

數據庫返回了大約24k(相當寬)的行,我將其寫入servLet輸出流。因此,存儲器中存儲了大量的數據。 你知道一種改進方法嗎?我需要將所有提取的數據發送到web客戶端,只需一個響應。因此我不認爲我可以從數據庫中獲取數據。 – 2010-03-22 06:32:22