无法禁用Google Appengine的servlet响应输出缓冲

时间:2016-07-12 17:57:27

标签: google-app-engine servlets out-of-memory

我有一个项目托管在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)

有没有办法禁用输出缓冲?

1 个答案:

答案 0 :(得分:1)

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

来自 How Requests are Handled

  

流式响应

     

App Engine不支持发送数据的流式响应   在处理请求时向客户端添加增量块。   如上所述收集代码中的所有数据并作为a发送   单个HTTP响应。

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