Ram*_*Ram 5 java out-of-memory dataoutputstream
我有以下代码生成OutOfMemory异常:
byte[] buf = new byte[10240];
int len = 0;
DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
while ((len = _inputStream.read(buf)) > 0) {
System.out.println("len : " + len);
System.out.println("Going to write buf into dataOS : " + buf.length);
dataOS.write(buf, 0, len);
System.out.println("dataOS.size() : " + dataOS.size());
}
_inputStream.close();
Run Code Online (Sandbox Code Playgroud)
以下是调试输出的最后几行:
len : 10240
Going to write buf into dataOS : 10240
dataOS.size() : 342804702
len : 10240
Going to write buf into dataOS : 10240
dataOS.size() : 342814942
len : 10240
Going to write buf into dataOS : 10240
Run Code Online (Sandbox Code Playgroud)
当我尝试写入342814942以外的dataOS时发生异常.
有人可以帮我处理这件事吗?
谢谢!
jta*_*orn 14
它与DataOutputStream(它不保留任何数据)以及与底层流有关的一切都无关conn.getOutputStream()
.现在,你没有在那里显示相关代码,但我猜测"conn"是HttpURLConnection的一个实例.我相信HttpURLConnection的输出流缓冲输出,以便它可以确定输出长度(除非你明确设置它).如果你知道输出长度,你可以直接使用它来设置HttpURLConnection.setFixedLengthStreamingMode
,或者你可以调用HttpURLConnection.setChunkedStreamMode
允许数据以块的形式发送而不是完全缓存在内存中.
在将来,遇到OOME时,应始终生成堆转储并在内存分析器中打开它.几乎总会立即向您显示问题所在(例如在底层流中,而不是 DataOutputStream).