2013-02-27 24 views
0

我正在调试运行一段时间后已经用完了permgen空间的GWT Web应用程序,并且在VisualVM中的线程转储中发现有248个进程正在等待锁定相同的StringBuffer ,例如:线程转储显示大量被阻止的进程

2013-02-27 10:56:30 
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.3-b01 mixed mode): 

"Attach Listener" daemon prio=10 tid=0x00007f3bdc00f000 nid=0x3bee waiting on condition [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

    Locked ownable synchronizers: 
    - None 

"[email protected]" prio=10 tid=0x00007f3ba8209800 nid=0x301f waiting for monitor entry [0x00007f3b6a15f000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at org.mortbay.log.StdErrLog.warn(StdErrLog.java:128) 
    - waiting to lock <0x0000000087b405c8> (a java.lang.StringBuffer) 
    at org.mortbay.jetty.handler.ContextHandler$SContext.log(ContextHandler.java:1424) 
    at com.google.gwt.user.server.rpc.RPCServletUtils.writeResponseForUnexpectedFailure(RPCServletUtils.java:389) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doUnexpectedFailure(AbstractRemoteServiceServlet.java:110) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:67) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

    Locked ownable synchronizers: 
    - None 

"[email protected]" prio=10 tid=0x00007f3ba8207800 nid=0x2ff7 waiting for monitor entry [0x00007f3b6a260000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at org.mortbay.log.StdErrLog.warn(StdErrLog.java:128) 
    - waiting to lock <0x0000000087b405c8> (a java.lang.StringBuffer) 
    at org.mortbay.jetty.handler.ContextHandler$SContext.log(ContextHandler.java:1424) 
    at com.google.gwt.user.server.rpc.RPCServletUtils.writeResponseForUnexpectedFailure(RPCServletUtils.java:389) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doUnexpectedFailure(AbstractRemoteServiceServlet.java:110) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:67) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

    Locked ownable synchronizers: 
    - None 

"[email protected]" prio=10 tid=0x00007f3ba8205800 nid=0x2f89 waiting for monitor entry [0x00007f3b6a361000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at org.mortbay.log.StdErrLog.warn(StdErrLog.java:128) 
    - waiting to lock <0x0000000087b405c8> (a java.lang.StringBuffer) 
    at org.mortbay.jetty.handler.ContextHandler$SContext.log(ContextHandler.java:1424) 
    at com.google.gwt.user.server.rpc.RPCServletUtils.writeResponseForUnexpectedFailure(RPCServletUtils.java:389) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doUnexpectedFailure(AbstractRemoteServiceServlet.java:110) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:67) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

    Locked ownable synchronizers: 
    - None 

...etc... 

这是问题吗?什么可能导致这个?应用程序在开发机器上运行,我是唯一一个查看它的人。

+0

使用'StringBuffer'非常奇怪。哪个版本的Java? – irreputable 2013-02-27 01:52:17

+0

@irreputable - Oracle JDK 1.7.0_07 – aco 2013-02-27 01:57:34

+0

您是否尝试过这些选项? -XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled (见http://stackoverflow.com/questions/88235/dealing-with-java-lang-outofmemoryerror-permgen-space-error) – Bizmarck 2013-02-27 02:00:02

回答

0

简答:在您的应用程序中发生了一些内部异常,您需要检查服务器日志(码头日志,访问日志,应用程序日志等)以确定根本原因。


分析:

StringBuffer被定义为一个实例变量在org.mortbay.log.StdErrLog

public class StdErrLog implements Logger {  
    // ... 
    StringBuffer _buffer = new StringBuffer(); 
    //... 
} 

,并且其使用包裹在一个​​块:

public void warn(String msg,Object arg0, Object arg1) 
{ 
    String d=_dateCache.now(); 
    int ms=_dateCache.lastMs(); 
    synchronized(_buffer) 
    { 
     tag(d,ms,":WARN:"); 
     format(msg,arg0,arg1); 
     System.err.println(_buffer.toString()); 
    } 
} 

因此如果有多个线程试图调用这个方法,只有一个线程会通过,其他线程不得不等待(如你的线程堆栈)。

我们可以看到这个方法是从com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doUnexpectedFailure()调用的,这意味着你的内部代码中有一个内部异常。以下是从JavaDoc of this method报价:

此方法仅对于那些不是服务方法的签名,或者从RPC框架内SecurityExceptions,SerializationExceptions,或其他故障该结果的一部分异常或错误调用。

由于有这么多线程阻塞在此方法中,你是唯一的客户端访问服务器,我的猜测是有可能是您的客户端代码中的错误,它发送一串意想不到的请求到的服务器。您需要检查服务器日志(码头日志,访问日志,应用程序日志等)以确定根本原因。