【问题标题】:Java Out of memory - Out of heap sizeJava 内存不足 - 堆大小不足
【发布时间】:2014-08-02 23:52:24
【问题描述】:

我下载了示例程序,用于客户端和服务器之间的文件传输。当我尝试使用 1 GB 文件运行程序时,我得到了 线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间 在 Client.main(Client.java:31)。

编辑: 第 31 行: byte [] mybytearray = 新字节 [FILE_SIZE];

public final static int FILE_SIZE = 1097742336;
// receive file
      long startTime = System.nanoTime();
      byte [] mybytearray  = new byte [FILE_SIZE];
      InputStream is = sock.getInputStream();
      fos = new FileOutputStream(FILE_TO_RECEIVED);
      bos = new BufferedOutputStream(fos);
      bytesRead = is.read(mybytearray,0,mybytearray.length);
      current = bytesRead;

      do {
         bytesRead =
            is.read(mybytearray, current, (mybytearray.length-current));
         if(bytesRead >= 0) current += bytesRead;
      } while(bytesRead > -1);

      bos.write(mybytearray, 0 , current);
      bos.flush();

有什么解决办法吗?

【问题讨论】:

  • 好吧,你在堆上分配了 1GB。您的 JVM 堆大小设置为多大?
  • 这是一个独立的 java 程序吗?查看 -Xmx 参数,给程序更大的堆大小。
  • 我将 -Xmx 值设置为 1 GB ,就像 java -Xmx1000m Client 一样,但我仍然收到错误
  • @Andrew ,不,我在一个控制台中启动服务器程序,在另一个控制台中启动一个客户端
  • 如果您将最大堆大小设置为 1gb,您仍然会收到错误消息,因为您有 1gb。将其设置为 2GB。

标签: java


【解决方案1】:

即使您解决了此文件的内存分配问题,问题发生的可能性仍然存在您可能需要研究流式传输:

int count;
byte[] buffer = new byte[8192];
while ((count = inStream.read(buffer)) > 0)
{
  outStream.write(buffer, 0, count);
}

【讨论】:

    【解决方案2】:

    您可以尝试设置 Xmx 和 Xms 属性,如下所述: -Xms : Initial heap size or minimum heap size?

    【讨论】:

      【解决方案3】:

      好吧,鉴于您尝试在内存中保存一个 1gb 的文件,内存不足错误是可以理解的。 Java 没有那么多内存可供您使用。

      -Xmx 标志允许您设置最大堆大小。

      -Xmx2000m 应该够了。

      如果您收到“无法保留足够的空间”错误,这意味着您的计算机没有足够的可用内存。尝试一个较小的文件或将文件分成小块并一次分析它们。或者通过分块读取文件将其作为多个数据包发送。

      【讨论】:

        【解决方案4】:

        使用标志 -Xmx2G 或大于 1G 的值再试一次

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-24
          • 2013-09-10
          • 2021-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-19
          相关资源
          最近更新 更多