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/

posted on 2016-08-03 21:16  快鸟  阅读(1172)  评论(0编辑  收藏  举报