Java内存不足 - 超出堆大小

时间:2014-06-12 15:19:00

标签: java

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

编辑: 第31行: byte [] mybytearray = new byte [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();

有没有解决这个问题?

4 个答案:

答案 0 :(得分:1)

好吧,鉴于你试图在内存中有一个1GB的文件,内存不足的错误是可以理解的。 Java没有那么多可用的内存。

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

-Xmx2000m应该是emough。

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

答案 1 :(得分:1)

您可以尝试按照此处所述设置Xmx和Xms属性: -Xms : Initial heap size or minimum heap size?

答案 2 :(得分:1)

即使你超过了这个文件的内存分配问题,问题的可能性仍然存在你可能想看看流媒体:

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

答案 3 :(得分:0)

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