抓过一次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
跟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秒
对了,就算不设置超时时间,httpclient应该有默认超时时间的,不会一直死在那个地方吧
Returns the timeout until a connection is etablished. A value of zero means the timeout is not used. The default value is zero.
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
"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秒
对了,就算不设置超时时间,httpclient应该有默认超时时间的,不会一直死在那个地方吧
Returns the timeout until a connection is etablished. A value of zero means the timeout is not used. The default value is zero.