刷新JSP文件时的线程锁定

7
在高负载情况下,当对JSP文件进行GZip压缩和解压缩时,我看到很多线程被锁定。线程转储如下所示。似乎来自大小为14Kb的“header.jsp”。
http-0.0.0.0-8080-304" daemon prio=3 tid=0x0000000008bcc000 nid=0x302 runnable [0xfffffd7de7bc2000]
   java.lang.Thread.State: RUNNABLE
    at java.util.zip.Deflater.deflateBytes(Native Method)
    at java.util.zip.Deflater.deflate(Deflater.java:306)
    - locked <0xfffffd7e589078e8> (a java.util.zip.ZStreamRef)
    at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:159)
    at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:118)
    at java.util.zip.GZIPOutputStream.write(GZIPOutputStream.java:72)
    - locked <0xfffffd7e58524d28> (a java.util.zip.GZIPOutputStream)
    at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:91)
    at com.pinksheets.common.web.cache.ServletOutputStreamWrapper.write(ServletOutputStreamWrapper.java:24)
    at java.io.OutputStream.write(OutputStream.java:99)
    at 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)
    - locked <0xfffffd7e58524d48> (a java.io.OutputStreamWriter)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.write(BufferedWriter.java:170)
    - locked <0xfffffd7e58524d48> (a java.io.OutputStreamWriter)
    at java.io.PrintWriter.write(PrintWriter.java:382)
    - locked <0xfffffd7e5824bd80> (a java.io.BufferedWriter)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:119)
    at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:326)
    at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:342)
    at org.apache.jsp.include.header_jsp._jspService(header_jsp.java:2032)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

你能发布其他线程正在做什么吗? - Ramesh PVK
1个回答

3
一些相关链接: 我们遇到了类似的问题——目前最好的理论是Java代码(或者使用底层zlib库的方式)会导致线程像这样无限旋转。到目前为止,我们唯一能够防止其出现的方法就是不压缩响应内容——但与其不压缩,我们宁愿支付100%的CPU成本(因为其他线程仍然非常响应)。距离您发布的时间已经过去几个月了,请问您有其他信息可以分享吗?

"你已经好几个月没有发布过了。我也遇到了同样的问题。在JDK 1.7上使用Apache CXF和Jetty。你有其他信息可以分享吗?" 另一个链接也没有解决方案:https://forums.oracle.com/forums/thread.jspa?messageID=4627097 - Thilo
2
很抱歉,据我们所知,让Java直接执行gzip对于在移动(即不稳定/间歇性)连接下负载较重的系统来说并不是一个好主意。我们发现,将nginx放在前面并让它执行gzip(以及SSL),然后简单地代理到Java Web应用程序中,可以获得更好的结果。 - Scott Corscadden
回复:proxy-pass:这似乎是一个不错的解决方案。巧妙地绕过了这个问题,而且可能更好。 - Thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接