printf "%x\n" 4311
一次异常日志
jstack 4297 |grep 10d8 -A 30
"C2 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f75680ba000 nid=0x10d8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f75680b7000 nid=0x10d7 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f75680b5800 nid=0x10d6 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f756807d800 nid=0x10d5 in Object.wait() [0x00007f754b5f4000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x000000008024a5a8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f756807b800 nid=0x10d4 in Object.wait() [0x00007f754b6f5000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
- locked <0x000000008024a910> (a java.lang.ref.Reference$Lock)
"main" #1 prio=5 os_prio=0 tid=0x00007f7568008800 nid=0x10cb runnable [0x00007f756e047000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:464)
at org.apache.catalina.startup.Catalina.await(Catalina.java:717)
at org.apache.catalina.startup.Catalina.start(Catalina.java:663)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
可能的原因
1.联系FTP提供方才知道是FTP服务器限制了文件大小造成的
2.检查程序,没有发现任何问题,总觉得自己知识匮乏找不到原因,然后又去查找网络问题,通过ping检查网络非常流畅,不丢包,经过研究ftp他是基于TCP协议的,在ftp原理上分为两链路,一个是控制链路,一个是数据链路,经测试,控制链路没有问题,通过命令查看,切换目录没有问题,但是get数据时,就超时断开了,因此应该是,数据链路出了问题,看来不能经过简单的ping来帮助我这种网络菜鸟排除网络问题,请来了公司的网络技术大牛,原因找到了原来是路由出了问题,重启路由解决。
3.ftp上传文件名为中文问题
jstack
1.通过堆栈信息看,线程状态为RUNNABLE,不是BLOCKED状态,说明不是因为锁导致线程阻塞,而是阻塞在了网络读取上
2.网络连接时,必须设置超时,不能无限制等待。发散一下,开发系统时,必须考虑各种异常情况
在thread dump中,要留意下面几种状态
死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)
执行中,Runnable
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
停止,Parked
总结了一下jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
linux使用jstack来找出死循环的java代码
jstack和线程dump分析
linux 下jstack分析cpu占用100%跟踪方法