Linux上分析java程序的问题
通过日志看不出来的问题,可以通过看java的堆栈信息(dump文件)来看出一些端倪。
1. 找java的进程id、jdk/bin的目录
ps -ef | grep java : 查看 java 进程
jps : 查看 java 进程
jps -vm : 查看 java 进程的启动信息
2. jstack 查看堆栈信息
(没有设置 java 环境变量的话,cd 到 jdk/bin 的目录,执行jstack命令)
./jstack [pid] 需要在catalina_yyyy-MM-dd.log里面看dump信息
./jstack -l -F [pid] 强制打印栈信息,可以在console中看dump信息
参数:
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.
如果是外置 tomcat 容器,必要时,查看catalina_xxxx.log 的日志
3. 查看内存占用情况
free -m 查看系统内存
df -h 查看磁盘空间
2016-08-03 问题: 最后定位到执行SQL时,线程BLOCK在那里不动,数据库连接池也没设置timeout,所以就一直挂在那里不动,后面的日志也打不出。最终发现,是在oracle客户端执行了一条delete语句,没有commit导致。
4. 查看网络和端口情况
ping [ip] : 查看 ip 数据包传输情况
telnet [ip] [端口] :查看端口是否通
netstat -ano : 查看端口开启情况
netstat -ano | grep 2181 : 查看连接的是哪个 zk (最准确的,比看配置准确)。(有时,你看到的配置文件里面的配置未必就是真正使用的配置,可能有隐藏的配置覆盖了你的配置,导致出问题)
netstat -ano | grep 2181 | wc -l : 在 zk 服务器上执行,可以统计有多少客户端连接了 2181 端口,即 zk 的连接数
ss -lnrt 查看监听端口情况,比如:查看 web 应用启动后监听的是哪个端口(8080或者...) https://www.cnblogs.com/ftl1012/p/ss.html
5. jvm cpu 高负载的排查方法

参考文章:https://cloud.tencent.com/developer/article/1585194
下面这篇文章写的可以:
http://loudou.info/blog/2014/03/01/yong-jstack-xian-cheng-ding-wei-chu-ti-yan/
浙公网安备 33010602011771号