Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpURLConnection缓冲而不是流,尽管设置了分块流模式?_Java_Streaming_Out Of Memory_Httpurlconnection_Http Chunked - Fatal编程技术网

Java HttpURLConnection缓冲而不是流,尽管设置了分块流模式?

Java HttpURLConnection缓冲而不是流,尽管设置了分块流模式?,java,streaming,out-of-memory,httpurlconnection,http-chunked,Java,Streaming,Out Of Memory,Httpurlconnection,Http Chunked,我正在使用HttpURLConnection将文件写入服务器,其中一些文件相当大 final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 前一段时间,我在写1GB或更大的对象时遇到了问题。我通过将其设置为更易于管理的数据块大小来解决这个问题 final int bufferSize = 1024 * 1024; [...] conn.setChunkedStreamingMode(bufferSize);

我正在使用
HttpURLConnection
将文件写入服务器,其中一些文件相当大

final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
前一段时间,我在写1GB或更大的对象时遇到了问题。我通过将其设置为更易于管理的数据块大小来解决这个问题

final int bufferSize = 1024 * 1024;
[...]
conn.setChunkedStreamingMode(bufferSize);
当时它在我的笔记本电脑上运行良好,但在其他机器上却崩溃了。经过调查,我发现原因是写入输出流时发生的内存不足错误

final OutputStream out = conn.getOutputStream();
final long bytesWritten = IOUtils.copyLarge(in, out);
在copyLarge例程中,我发现它能够完成4096字节的262145次迭代,但当它试图跨越1GB线路时失败了。为java应用程序分配更多内存似乎可以防止这些崩溃,但我认为这应该是不必要的。如果它正在写入1MB的数据块,那么它要么会以更少的迭代次数失败,要么会重复写入1MB而不会出现问题


更新:原来设置ChunkedStreamingMode的行在某些机器上实际上没有被调用。如果您没有设置固定/分块流模式,HttpURLConnection只会将所有内容发送到PosterOutputStream/ByteArrayOutputStream。

您是否验证了它正在使用
传输编码:分块
?否则,它将需要缓冲所有内容以计算
内容长度。类似Wireshark的东西可能会帮助您诊断数据是否正确发送。有趣的是,它是什么机器/JRE版本?你修好了吗?如果是,具体如何?你能发布一个描述解决方案的答案吗?有人能结束这个问题吗?否则,即使提问者回答了自己的问题,它也会继续出现在“未回答”部分。请将您的解决方案作为答案发布,然后接受它。:)