簡體   English   中英

傳輸字節數組時出現Java OutOfMemory問題

[英]Java OutOfMemory issue while transferring byte array

我正在編寫遠程桌面應用程序。 所以我將圖像從一台機器傳輸到另一台機器,作為字節數組通過套接字。 收到字節數組后,我將其轉換為圖像並在面板上繪制。 代碼看起來大致如下

imageBytes = //read from socket.
InputStream in = new ByteArrayInputStream(imageBytes);
BufferedImage bufferedImage = ImageIO.read(in);
Image image = Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
Image scaledImage = image.getScaledInstance(rmdPanel.getWidth(),rmdPanel.getHeight() ,Image.SCALE_FAST);
Graphics graphics = rmdPanel.getGraphics();
graphics.drawImage(scaledImage, 0, 0, rmdPanel.getWidth(),rmdPanel.getHeight(),rmdPanel);

我還存儲圖像字節直到下一個圖像來(為了比較)。 現在我在這段代碼中獲得了java內存異常(同時接收字節數組)。 我的堆大小為128 mb-512 mb。 發送的圖像字節最大為3mb。

imageBytes = //read from socket.
InputStream in = new ByteArrayInputStream(imageBytes);
BufferedImage bufferedImage = ImageIO.read(in);

為什么要將圖像字節讀入數組? 你不需要那個。 如果ByteArrayInputStream復制字節數組,則至少需要花費一個額外的數據副本,可能需要兩個。 直接從套接字執行ImageIO.read()。

(你沒有顯示通信代碼,所以我只是猜測)如果你在套接字流上使用ObjectInputStream / ObjectOutputStream,你需要知道他們緩存通過網絡發送的對象(以避免重新發送相同的數據) 。 有時,這是一個很好的功能,但如果對象持有太長時間,它可能會導致問題。 您需要定期調用ObjectOutputStream上的reset()來清除此緩存(在您的情況下,可能在每次圖像發送后)。

當然,解決這個問題的最可靠方法是附加一個內存分析器,看看是什么在使用所有內存(或分析堆轉儲)。

認為 ImageIO.read(...)會對圖像或其輸入流進行某種緩存,因此在您繼續閱讀圖像時可能會導致內存不足。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM