背景
出问题的系统是一个存储系统,系统有一个功能就是多线程下载hadoop上的文件;上层业务方使用的是python,而公司不提供python api下载hadoop上的文件,只提供java api下载;因此我们的系统就变成了上层用户通过python调用我们的python api,我们的python api通过py4j调起jvm操作java中的对象和方法;用户在下载文件通常是100多个进程,某天用户通知我们说你们下载一个文件咋下载了一整天都没下载下来,根据日志和下载的文件发现不是因为下载文件慢,而是程序就卡住了;
分析过程
1、分析日志,跟踪程序,发现代码没啥毛病,日志也看不出来个所以然
2、jstack -l pid 堆栈跟踪 ,堆栈信息给出部分
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
"Attach Listener" #186 daemon prio=9 os_prio=0 tid=0x00007fbf98001000 nid=0x28e8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"pool-47-thread-4" #185 prio=5 os_prio=0 tid=0x00007fbf4c44c800 nid=0x2b76 runnable [0x00007fbf348e3000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
- locked <0x0000000080223058> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:480)
- locked <0x0000000080223038> (a java.io.PrintStream)
at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
at ch.qos.logback.core.joran.spi.ConsoleTarget$1.write(ConsoleTarget.java:37)
at ch.qos.logback.core.encoder.LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder.java:131)
at ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:187)
at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:212)
at ch.qos.logback.core.OutputStreamAp