日期:2014-05-20  浏览次数:21012 次

Java TCP接收大文件OutofMemoryError
大家好,我用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();
        }
outofmemoryerror tcp socket file

------解决方案--------------------
这个输出流是会随时写入到硬盘的,看楼主的代码sb是StringBuilder的对象吗?如是的话不要累积append,是不是它溢出了?
------解决方案--------------------
看起来像是sb这个对象存的东西太多了,
如果printMessage()这个方法没有每次都把sb清空的话,
多半是要内存溢出的,
建议每次把这种日志存到日志文件或者数据库里,
不要用一个StringBuffer全部存下来
如果实在用就设置-Xmx2g,不过这样治标不治本迟早还是会OOM的