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);
}
Что касается тел ответа, он будет храниться в памяти до размера буфера. Все, что больше размера буфера, будет сброшено. Размер буфера по умолчанию обычно составляет 2 КБ. Это настраивается на уровне приложений и ServletResponse#setBufferSize()
. Если вы установите слишком большой размер буфера, он поглотит память.