gpt4 book ai didi

java - java 堆空间内存不足

转载 作者:行者123 更新时间:2023-12-01 12:45:07 26 4
gpt4 key购买 nike

我正在尝试将文件 block 从服务器发送到多个客户端。当我尝试发送大小为 700mb 的文件时,显示“OutOfMemory java heap space”错误。我使用的是 Netbeans 7.1.2 版本。 我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为读取整个文件存在一些问题。下面的代码最多可处理 300mb。请给我一些建议。

提前致谢

public class SplitFile {   
static int fileid = 0 ;

public static DataUnit[] getUpdatableDataCode(File fileName) throws FileNotFoundException, IOException{

int i = 0;
DataUnit[] chunks = new DataUnit[UAProtocolServer.singletonServer.cloudhosts.length];

FileInputStream fis;

long Chunk_Size = (fileName.length())/chunks.length;
int cursor = 0;

long fileSize = (long) fileName.length();
int nChunks = 0, read = 0;long readLength = Chunk_Size;
byte[] byteChunk;

try {
fis = new FileInputStream(fileName);
//StupidTest.size = (int)fileName.length();
while (fileSize > 0) {
System.out.println("loop"+ i);
if (fileSize <= Chunk_Size) {
readLength = (int) fileSize;
}
byteChunk = new byte[(int)readLength];
read = fis.read(byteChunk, 0, (int)readLength);
fileSize -= read;
// cursor += read;
assert(read==byteChunk.length);
long aid = fileid;
aid = aid<<32 | nChunks;
chunks[i] = new DataUnit(byteChunk,aid);

// Lister.add(chunks[i]);
nChunks++;
++i;
}
fis.close();
fis = null;

}catch(Exception e){
System.out.println("File splitting exception");
e.printStackTrace();
}

return chunks;
}

最佳答案

随着文件大小的增长,读取整个文件肯定会触发 OutOfMemoryError。调整 -Xmx1024M 可能有助于临时修复,但它绝对不是正确/可扩展的解决方案。另外,无论您如何移动变量(例如在循环外部而不是循环内部创建缓冲区),您迟早都会遇到 OutOfMemoryError 。避免出现 OutOfMemoryError 的唯一方法是不要读取内存中的完整文件。

如果您必须仅使用内存,那么一种方法是将 block 发送到客户端,这样您就不必将所有 block 保留在内存中:

而不是:

chunks[i] = new DataUnit(byteChunk,aid);

做:

sendChunkToClient(new DataUnit(byteChunk, aid));

但是上述解决方案有一个缺点,如果在 block 发送之间发生一些错误,您可能很难尝试从错误点恢复/恢复。

像 Ross Drew 建议的那样将 block 保存到临时文件可能更好、更可靠。

关于java - java 堆空间内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com