刷新jsp文件时的线程锁定

Sus*_*hah 6 buffer jsp locking flush gzipstream

在重负载下,我看到在GZipping和解压缩JSP文件时许多线程被锁定.线程转储如下所示.似乎来自"header.jsp",大小为14Kb.

"http-0.0.0.0-8080-304"守护程序prio = 3 tid = 0x0000000008bcc000 nid = 0x302 runnable [0xfffffd7de7bc2000] java.lang.Thread.State:java中的java.util.zip.Deflater.deflateBytes(Native Method)的RUNNABLE .util.zip.Deflater.deflate(Deflater.java:306) - 在java的java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:159)上锁定<0xfffffd7e589078e8>(java.util.zip.ZStreamRef). java.util.zip.GZIPOutputStream.write(gZIPOutputStream.java:72)中的util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:118) - 在java.util上锁定<0xfffffd7e58524d28>(java.util.zip.GZIPOutputStream) .zip.DeflaterOutputStream.write(DeflaterOutputStream.java:91)位于java.io.OutputStream.write(OutputStream.java:99)的com.pinksheets.common.web.cache.ServletOutputStreamWrapper.write(ServletOutputStreamWrapper.java:24) sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:263)at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106) - 罗 cked <0xfffffd7e58524d48>(java.io.OutputStreamWriter)java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)at java.io.BufferedWriter.write(BufferedWriter.java:170) - locked <0xfffffd7e58524d48>(java .io.OutputStreamWriter)在java.io.PrintWriter.write(PrintWriter.java:382) - 在org.apache.jasper.runtime.JspWriterImpl.flushBuffer上锁定了<0xfffffd7e5824bd80>(java.io.BufferedWriter)(JspWriterImpl.java: 119)位于org.apache.jsp.include.header_jsp的org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:326)atg.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:342)位于org.apache.jasper.runtime.HttpJspBase.service的(._jsp.java:2032)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Sco*_*den 3

一些推论链接:

我们遇到了类似的问题 - 到目前为止,我们最好的理论是 Java 代码(或它使用底层 zlib 支持库的方式)可以导致线程以这种方式脱离空间。到目前为止,我们能够防止这种情况的唯一方法是不进行 GZip 响应 - 但我们宁愿支付 100% 的 CPU 成本(因为其他线程仍然具有高度响应性),而不是不对其进行 GZIP。你发帖已经过去几个月了;您还有其他信息可以分享吗?

  • 抱歉,不 - 据我们所知,对于移动(即不稳定/间歇性)连接负载下的系统来说,让 Java 直接执行 gzip 并不是一个好主意。我们发现,将 nginx 放在前面并让它执行 gzip(以及 SSL)并简单地代理传递到 java web 应用程序,结果要好得多。 (2认同)