【问题标题】:Java OutOfMemory issue while transferring byte array传输字节数组时出现 Java OutOfMemory 问题
【发布时间】:2019-07-09 10:23:29
【问题描述】:

我正在编写远程桌面应用程序。所以我通过套接字将图像从一台机器传输到另一台机器作为字节数组。收到字节数组后,我将其转换为图像并在面板上绘制。代码大致如下所示

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);

我还存储 imagebytes 直到下一张图片出现(用于比较)。现在我在这段代码中得到了 java 内存不足异常(在接收字节数组时)。我的堆大小为 128 mb-512 mb。发送的图像字节最大为 3mb。

【问题讨论】:

  • 你能贴出从套接字读取字节数组的代码吗?您说接收字节数组时发生异常,所以这可能是有问题的代码所在。
  • 您粘贴的代码没有任何突出之处。你要关闭你的流吗?当您说您以 128mb-512mb 运行时,您是什么意思?你的 Xms Xmx 值是多少?

标签: java sockets networking network-programming awt


【解决方案1】:

(您没有显示通信代码,所以我只是猜测)如果您在套接字流上使用 ObjectInputStream/ObjectOutputStream,您需要注意它们缓存通过线路发送的对象(以避免重新发送相同的数据)。有时,这是一个不错的功能,但如果对象保存时间过长,它可能会导致问题。您需要定期在 ObjectOutputStream 上调用 reset() 以清除此缓存(在您的情况下,可能在每次发送图像之后)。

当然,解决此问题的最可靠方法是附加内存分析器并查看所有内存的使用情况(或分析堆转储)。

【讨论】:

  • jdk 中有一个简单的内存分析器 (jhat),它将检查堆转储(您可以通过添加命令行选项 -XX 让您的程序在获得 OOM 时生成堆转储:+HeapDumpOnOutOfMemoryError)。您可以使用 jvisualvm(也在 jdk 中)来分析应用程序。我相信 netbeans 和其他各种免费 ide 都包括分析器。或者,你可以买一个。我们个人使用yourkit java profiler,非常棒。
【解决方案2】:
imageBytes = //read from socket.
InputStream in = new ByteArrayInputStream(imageBytes);
BufferedImage bufferedImage = ImageIO.read(in);

为什么要将图像字节读入数组?你不需要那个。如果 ByteArrayInputStream 复制字节数组,它至少会花费您一份额外的数据副本,可能会花费两份。只需直接从套接字执行 ImageIO.read() 即可。

【讨论】:

  • 不,我需要它,因为如果图像没有太大变化,我将只发送更改的字节并使用以前的图像在服务器端重建。这样我会减少网络流量。跨度>
  • @hnm:我的观点仍然存在:如果要运送整个图像,您可以直接在套接字上使用 ImageIO.read()。如果不是,您将无法使用您显示的任何代码。您不能“仅发送更改的字节”并期望 ImageIO.read() 读取它们。
【解决方案3】:

认为 ImageIO.read(...) 会对图像或其输入流进行某种缓存,因此可能会导致您在继续阅读图像时耗尽内存。

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多