【问题标题】:Not able to disable servlet response output buffering of Google Appengine无法禁用 Google Appengine 的 servlet 响应输出缓冲
【发布时间】: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


    【解决方案1】:

    App Engine 实例不支持数据流式传输 - 它们总是返回完整的响应。如果需要流式传输数据,可以使用灵活的环境。

    来自 How Requests are Handled

    流式响应

    App Engine 不支持发送数据的流式响应 在处理请求时向客户端增加块。 您的代码中的所有数据均按上述方式收集并以 单个 HTTP 响应。

    但是请注意,对于如此小的响应,例如您的情况(最多 200KB),流式传输可能比一次返回所有数据的效率低得多且速度慢。

    【讨论】:

    • 这种行为有文档吗?
    • 我为你添加了一个链接。
    猜你喜欢
    • 2023-03-14
    • 2010-09-11
    • 2020-12-03
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多