我与在JBoss-4.2.3.GA下部署的基于Spring MVC的应用程序打交道,并想阐明Servlet输入/输出流如何与庞大的请求/响应主体一起工作。我很烦,因为在调用将完全完成之前,不想将整个请求/响应都保留在内存中。
如何准确检测JBoss传递给servlet的输入/输出流实现?还是我可以按照某种规范研究它的行为?
感谢您提供任何有用的信息。
最佳答案
缺省情况下,Servlet API不会将整个请求和响应主体保留在内存中。有效地是您自己的处理/解析代码。
至于请求正文,在处理它时,请勿将整个正文放在byte[]
中。是的,byte[]
的每个字节占用Java内存的一个字节。您应该尝试(重新)编写代码,以使其永远不会将整个主体保存在内存中。例如逐行处理或逐个缓冲区处理和/或立即将其流式传输到OutputStream
。
例如。当身体是基于角色的:
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(someOutputStream, "UTF-8"));
for (String line; (line = reader.readLine()) != null;) {
processIfNecessary(line);
writer.writeln(line);
}
或主体是基于字节的:
BufferedInputStream input = new BufferedInputStream(request.getInputStream());
BufferedOutputStream output = new BufferedOutputStream(someOutputStream);
byte[] buffer = new byte[1024]; // 1KB buffer.
for (int length; (length = input.read(buffer)) > 0;) {
processIfNecessary(buffer);
output.write(buffer, 0, length);
}
至于响应主体,它将一直保存在内存中,直到缓冲区大小为止。超出缓冲区大小的所有内容都将被刷新。默认缓冲区大小通常为2KB。这可以在应用服务器级别和
ServletResponse#setBufferSize()
上配置。当您将缓冲区大小设置得太大时,它将占用内存。关于java - JBoss输入/输出流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5502321/