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版本?你修好了吗?如果是,具体如何?你能发布一个描述解决方案的答案吗?有人能结束这个问题吗?否则,即使提问者回答了自己的问题,它也会继续出现在“未回答”部分。请将您的解决方案作为答案发布,然后接受它。:)