2014-01-09 131 views
3

我正在爲WebSphere的response.getOutputStream()寫一個很大的響應(數百Mb)。 看來,Web Sphere始終將整個輸出流數據存儲在某些內部內存緩衝區中,然後再將其提供給客戶端。因此,我的服務器處理(生成數據)在幾秒鐘內完成,而瀏覽器可能仍在下載半小時。在那段時間內,整個響應仍保存在內存中。WebSphere響應緩存

是否可以避免這種緩衝? 我會優先考慮更多的等待輸出流的servlet線程,而不是浪費內存的千兆位。

我的Web Sphere版本是8.5.0。

我試過設置內容長度和分塊響應 - 它們都一樣,仍然緩衝。 我的TCP傳輸鏈設置是32 KB響應緩衝區的默認設置,但它以某種方式被忽略。

回答

5

同時在WAS web容器custom properties中找到答案。

默認情況下,Web容器使用異步寫入將響應數據寫入區塊直至響應緩衝區大小。對於大於響應緩衝區大小的較大響應,Web容器繼續將響應數據緩衝到內存中,同時等待響應數據塊的異步寫入完成。此過程可能導致部分內存中存在大量響應,這可能導致內存使用率過高並可能導致內存不足錯誤。當服務器同時處理比Web容器定義的線程更多的請求時,也可能發生應用程序服務器掛起。

如果com.ibm.ws.webcontainer.channelwritetype屬性設置爲同步,則使用同步寫入,否則默認情況下使用異步寫入。通過同步寫入,響應數據以最大爲響應緩衝區大小的塊的形式同步寫入,並且在等待響應數據塊的同步寫入完成時,不會將響應數據緩存到內存中。因此,內存中保存的近似最大響應數據量等於responsebuffersize乘以Web容器線程數量。 Web容器可以同時處理的最大請求數受Web容器線程數限制。其他請求排隊,等待正在處理的請求完成。

responsebuffersize web容器自定義屬性定義Web容器在單個塊中寫入的最大響應數據量,默認爲32k。因此,它用於更改Web容器發送完整響應數據所需的寫入次數。但是,如果應用程序刷新響應數據,則無論響應緩衝區大小如何,都會立即寫入由Web容器保存的任何響應數據。

使用以下名稱 - 值對使用同步寫入來寫入數據塊。

com.ibm.ws.webcontainer。channelwritetype async

+0

我想你應該接受你自己的答案。 – fnt

+0

是的,這也對我們有效。百+ MB大小的PDF – Renan

1

您確定此數據是由Websphere存儲在內部內存緩衝區中嗎? Websphere通道輸出緩衝區一次只能保存32K的數據。所以剩下的數據可能是由您的servlet保存的,因爲您已經生成了一些存儲在堆中的大數據,並由您的代碼引用。

看看你的代碼,看看你的代碼引用了什麼數據,如果你想知道存儲在內存中的內容以及誰在保持活動狀態,請拍攝堆(堆轉儲)的快照。

+0

我已經開始瀏覽代碼並調查內存使用情況,發現沒有任何可疑內容。我結束了一個簡單的測試servlet,它只是將字節寫入輸出流,它不存儲任何東西。而且,本身使用本地內存作爲「asyc響應」緩衝區,所以它不可見作爲堆的一部分。 –