我有一個運行在Netty上的Java REST服務,用於上傳(流式傳輸)大量5MB到500MB的文件。在某些時候,當我增加併發上傳的數量時,應用程序會出現內存不足,這是預期的,但我正在尋找有關在此場景中應使用哪些Java GC和VM設置來提高性能的建議以及減少內存佔用。 如果有人可以分享類似的經歷,我將非常感激。用於Java/Netty文件上傳的GC選擇REST服務
更新:要向問題添加更多上下文,REST服務將文件作爲流傳輸並將相同的流傳遞給Amazon S3。
我有一個運行在Netty上的Java REST服務,用於上傳(流式傳輸)大量5MB到500MB的文件。在某些時候,當我增加併發上傳的數量時,應用程序會出現內存不足,這是預期的,但我正在尋找有關在此場景中應使用哪些Java GC和VM設置來提高性能的建議以及減少內存佔用。 如果有人可以分享類似的經歷,我將非常感激。用於Java/Netty文件上傳的GC選擇REST服務
更新:要向問題添加更多上下文,REST服務將文件作爲流傳輸並將相同的流傳遞給Amazon S3。
可能在發送大量數據時應該使用流量控制。您可以在發送數據之前檢查頻道是否可寫(Channel.isWritable()),並等待直到它準備就緒。您可以通過ChannelInboundHandler.channelWritabilityChanged(ChannelHandlerContext ctx)使用通知來跟蹤此情況。如果沒有流量控制,所有大文件都會消耗內存,等待在Netty的輸出緩衝區中發送數據。
謝謝@Igor!我會看看你提到的課程。 – Frank
爲什麼你會得到OOME,這一點並不明顯。一個正確編碼的應用程序不會這樣做。你沒有給出任何代碼或任何其他線索,以您的實例。 –
增加最大堆不是一個選項?如果你想使用更多的內存,似乎你應該允許虛擬機分配更多的內存。 – Dev
感謝您對Marko的評論。如果您嘗試發送100個併發請求(流),並且每個請求都有100MB文件,考慮到您正在使用2GB內存的單個服務器上進行測試,那麼「正確編碼」應用程序的預期行爲是什麼? – Frank