【发布时间】:2023-04-10 16:23:02
【问题描述】:
我有一个项目托管在 Google Appengine 标准运行时。 我已经定义了一个 servlet,它使用最多 200kb 的数据响应 GET 请求。问题是 servlet 在实际写出之前尝试缓冲大量数据。
我试图通过做来设置缓冲的上限,
resp.setBufferSize(1024);
但这没什么区别。缓冲区大小的即时日志,
LOGGER.info("Using buffer of size " + resp.getBufferSize());
告诉我缓冲区大小为 1024,但是一旦写入数据,我再次记录缓冲区大小,并且根据写入的数据,它已经增长到非常大的数量。
现在,如果我将输出增加到足够大的量,我会在写出该数据时得到一个异常。数据本身不存储在任何地方,它是直接生成并写入“ServletOutputStream”的。
Error for /sizeTestServlet
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.OutputStream.write(OutputStream.java:75)
at com.google.apphosting.runtime.jetty.RpcResponseGenerator.addContent(RpcResponseGenerator.java:65)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:644)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:589)
有没有办法禁用输出缓冲?
【问题讨论】:
标签: google-app-engine servlets out-of-memory