下次卡住的时候,用JDK自带的jstack.exe,看看Thread情况就比较清楚了。

解决方案 »

  1.   

    抓过一次thread dump ,其中有一个lock,但是这个lock在线程正常的时候也是有的,应该是读取返回内容的lock,不知道是不是因为这个原因,求分析啊2012-06-13 16:36:16
    Full thread dump Java HotSpot(TM) Client VM (11.0-b15 mixed mode):"JMX server connection timeout 12" daemon prio=6 tid=0x66107800 nid=0x17ac in Object.wait() [0x66c4f000..0x66c4fbe8]
       java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x08a89738> (a [I)
    at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(Unknown Source)
    - locked <0x08a89738> (a [I)
    at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:
    - None"RMI Scheduler(0)" daemon prio=6 tid=0x66103c00 nid=0x16c4 waiting on condition [0x66bff000..0x66bffc68]
       java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x08a897c0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
    at java.util.concurrent.DelayQueue.take(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:
    - None"RMI TCP Connection(1)-192.168.1.103" daemon prio=6 tid=0x66103800 nid=0x161c runnable [0x66baf000..0x66bafce8]
       java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    - locked <0x08a8b978> (a java.io.BufferedInputStream)
    at java.io.FilterInputStream.read(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:
    - <0x08a93040> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"RMI TCP Accept-0" daemon prio=6 tid=0x66193800 nid=0x1600 runnable [0x6689f000..0x6689fd68]
       java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(Unknown Source)
    - locked <0x08a8bc30> (a java.net.SocksSocketImpl)
    at java.net.ServerSocket.implAccept(Unknown Source)
    at java.net.ServerSocket.accept(Unknown Source)
    at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:
    - None"Low Memory Detector" daemon prio=6 tid=0x01a77800 nid=0xfb8 runnable [0x00000000..0x00000000]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"CompilerThread0" daemon prio=10 tid=0x01a34000 nid=0xfb4 waiting on condition [0x00000000..0x65e9f790]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"Attach Listener" daemon prio=10 tid=0x01a33400 nid=0xfb0 waiting on condition [0x00000000..0x65e4fb14]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"Signal Dispatcher" daemon prio=10 tid=0x01a32c00 nid=0xfac runnable [0x00000000..0x00000000]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"Finalizer" daemon prio=8 tid=0x01a20400 nid=0xf98 in Object.wait() [0x65daf000..0x65dafc68]
       java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x089d02b0> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    - locked <0x089d02b0> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)   Locked ownable synchronizers:
    - None"Reference Handler" daemon prio=10 tid=0x01a1b800 nid=0xf94 in Object.wait() [0x65d5f000..0x65d5fce8]
       java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x089d0338> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x089d0338> (a java.lang.ref.Reference$Lock)   Locked ownable synchronizers:
    - None"main" prio=6 tid=0x00c89400 nid=0xf6c runnable [0x003cf000..0x003cfe28]
       java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:260)
    at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:98)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:252)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:281)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:247)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:298)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:633)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:454)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:941)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:919)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:910)
    at HttpClientTest.httpGetResponse(HttpClientTest.java:34)
    at HttpClientTest.main(HttpClientTest.java:4)   Locked ownable synchronizers:
    - None"VM Thread" prio=10 tid=0x01a16c00 nid=0xf90 runnable "VM Periodic Task Thread" prio=10 tid=0x01a78800 nid=0xfbc waiting on condition JNI global references: 719
      

  2.   

    跟lock应该无关,是这里停止了,应该是对方无响应,所以在等待超时,这个超时会非常非常漫长。
    "main" prio=6 tid=0x00c89400 nid=0xf6c runnable [0x003cf000..0x003cfe28]
      java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:260)
    at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:98)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:252)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:281)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:247)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:298)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:633)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:454)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:941)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:919)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:910)
    at HttpClientTest.httpGetResponse(HttpClientTest.java:34)
    at HttpClientTest.main(HttpClientTest.java:4)
    自行设置超时时间吧:
    HttpConnectionManagerParams managerParams = httpClient.getHttpConnectionManager().getParams(); 
    managerParams.setConnectionTimeout(5000);  // 设置连接超时时间(单位毫秒) ,比如5秒
    managerParams.setSoTimeout(60000);  // 设置读数据超时时间(单位毫秒) ,比如60秒
      

  3.   


    对了,就算不设置超时时间,httpclient应该有默认超时时间的,不会一直死在那个地方吧
      

  4.   


    Returns the timeout until a connection is etablished. A value of zero means the timeout is not used. The default value is zero.
      

  5.   

    请问一下,楼主解决了这个问题吗。我用3.1版本也遇到这个问题,不定时出现线程无响应的情况。在设置超时时间仍然无效后,自行写了超时控制函数解决问题,但是业务仍然出现大量的超时失败问题。请求的服务端说没有收到我用客户端发出的响应,不知道为什么会出现请求无法发送出去的问题,并且这种问题貌似设置httpclient自带的超时参数是没有效果的。