死锁:资源互相竞争,相互拿着对方需要的锁,造成无法和解,程序僵死。
Socket超时,Socket连接未设置有效超时时间,连接、读取超时。
问题:
之前碰到过类似的,但是居然忘记了。昨天碰到的,再次记录一下。
现象:
在我处理的这个特殊场景下,可以理解为是个单线程的业务场景。需要进行下载文件,结果昨天晚上程序假死,下载文件没成功。第一时间怀疑死锁,因为做了改动,开了事务。
进行jstat -l pid >xxx.log。
分析之后未发现死锁,该运行的运行,但是发现一个内容很长的运行中的线程,这么特殊,仔细研究下,内容如下:
"scheduling-1" #18 prio=5 os_prio=0 tid=0x00007f7574752000 nid=0xca4 runnable [0x00007f7544f49000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)
at sun.security.ssl.InputRecord.read(InputRecord.java:532)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:990)
- locked <0x00000000fb0db3f0> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:948)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
- locked <0x00000000fb0f28d0> (a sun.security.ssl.AppInputStream)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
- locked <0x00000000fb0f28e8> (a java.io.BufferedInputStream)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593)
就是这个,一直跟踪下来,发现这个一直在运行,在等待读,我这个是使用第三方提供的jar包,里面
HttpURLConnection 没有设置连接和读取超时时间,这个connection 底层是socket协议,会进行阻塞,造成假死现象。
解决办法,设置连接和读取超时时间
上一次改了两个请求方法,以为其他地方没用到。结果还是踩了个坑。
有人说过一次故障后面是90次轻微故障,和10次隐患,这是真的。上次应该把这个第三方jar包所有的方法都改了,但是我只是改了两个。