Java Jetty/HttpServletResponse中的缓慢动态资源传输

Java Jetty/HttpServletResponse中的缓慢动态资源传输,java,servlets,jetty,Java,Servlets,Jetty,我们有一个环境,每个用户可以获得不同的html/js/css资源。我使用以下代码压缩和传输java脚本资源: public static byte[] compress(String str) throws IOException { if (str == null || str.length() == 0) { return null; } ByteArrayOutputStream obj=new ByteArrayOu

我们有一个环境,每个用户可以获得不同的html/js/css资源。我使用以下代码压缩和传输java脚本资源:

public static byte[] compress(String str) throws IOException {
        if (str == null || str.length() == 0) {
            return null;
        }
        ByteArrayOutputStream obj=new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.close();
        return obj.toByteArray();
}

...
HttpServletResponse raw = response.raw();
raw.setBufferSize(file.length().intValue());
ServletOutputStream servletOutputStream = raw.getOutputStream();
servletOutputStream.write(compress(FileUtils.readFileToString(file)));
servletOutputStream.flush();
servletOutputStream.close();
...
使用chrome网络标签检查问题,300KB压缩数据的下载时间为2秒-这似乎不合理。
问题不在于带宽或jetty本身,因为静态资源传输时间很快。

不知道这是否是造成瓶颈的原因,但我不会:

 raw.setBufferSize(file.length().intValue());
如果gzip文件的大小约为300KB,则可以创建大于该大小的响应缓冲区。而且,在流式传输静态内容时,根本不需要大的响应缓冲区

从servlet javadoc:

设置响应主体的首选缓冲区大小。这个 servlet容器将使用至少与大小相同的缓冲区 请求。使用的实际缓冲区大小可以使用 getBufferSize

更大的缓冲区允许在写入任何内容之前写入更多内容 实际发送,从而为servlet提供更多的设置时间 适当的状态代码和标题。较小的缓冲区会减少 服务器内存加载,并允许客户端开始接收更多数据 快点