大家好,我用TCP接收一个大文件,Socket另外一端持续发送Stream,我服务端不断接收并且写入文件,如果文件超过一定大小,例如大于1G,程序就会发生OutofMemoryError错误,内存溢出了,如何解决这个问题呢?下面是接收socket流并且写入文件的代码?请问有什么方法可以避免OutofMemoryError?谢谢
File file = FileHelper.newFile(fileName);
FileOutputStream fos= new FileOutputStream(file);
sb.setLength(0);
while (true) {
int read = 0;
if (in != null) {
read = in.read(buf);
}
passedlen += read;
if (read == -1) {
break;
}
sb.append("passedlen|len:"+passedlen+"|"+len+" percentage:" + String.format("%.5f", passedlen*100.0/len)+ "%\n\r\n");
System.out.println("percentage:" + String.format("%.5f", passedlen*100.0/len) + "%\n");
printMessage();
fos.write(buf, 0, read);
}
if(fos!=null)
{
fos.close();
}
------解决思路----------------------
这个输出流是会随时写入到硬盘的,看楼主的代码sb是StringBuilder的对象吗?如是的话不要累积append,是不是它溢出了?
------解决思路----------------------
看起来像是sb这个对象存的东西太多了,
如果printMessage()这个方法没有每次都把sb清空的话,
多半是要内存溢出的,
建议每次把这种日志存到日志文件或者数据库里,
不要用一个StringBuffer全部存下来
如果实在用就设置-Xmx2g,不过这样治标不治本迟早还是会OOM的