我下载了示例程序,用于客户端和服务器之间的文件传输。当我尝试使用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();
有没有解决这个问题?
答案 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的值再试一次