2014年9月24日 星期三

使用 HttpURLConnection 時的記憶體問題

以前同事寫的 HttpClient 套件,實作是靠 Java 原生的 HttpURLConnection
不過最近又發生了使用該 HttpClient 套件時,出現 OutOfMemoryError 的訊息
發生原因是因為透過該 HttpClient 傳輸的資料太大,把 JVM 的記憶體撐爆了。

花了一些時間搜尋後,同事發現在 HttpClient 裡面加上 HttpURLConnection.setChunkedStreamingMode(0) 後問題似乎就解決了。
而關於為什麼有這個問題、以及為什麼呼叫這個方法後就可以解決,原因大概可以參考 [1] 的描述。
以下節錄 [1] 文章開頭的兩段話:
post請求的OutputStream實際上不是網絡流,而是寫入內存,在getInputStream中才真正把寫道流裡面的內容作為正文與根據之前的配置生成的http request頭合並成真正的http request,並在此時才真正向服務器發送。

HttpURLConnection.setChunkedStreamingMode函數可以改變這個模式,設置了ChunkedStreamingMode後,不再等待OutputStream關閉後生成完整的http request一次過發送,而是先發送http request頭,正文內容則是網路流的方式實時傳送到服務器。實際上是不告訴服務器http正文的長度,這種模式適用於向服務器傳送較大的或者是不容易獲取長度的數據,如文件。

參考資料:
1、Http学习之使用HttpURLConnection发送post请求深入
2、HttpUrlConnection.setChunkedStreamingMode()

沒有留言: