一、分析客户端堆栈内存信息
可使用jconsole,jstack,jvisualvm查看客户端的堆栈或内存情况。
工具位置:jdk的bin路径(客户端自带jdk,在eas安装路径\eas\clientjdk\bin)
使用方法:
jonsole:
双击jconsole.exe,选择对应pid的客户端进程即可连接
Jconsole可以看到虚拟机的内存情况和线程堆栈等信息。
如果连接不上可以在client.bat加jvm 启动参数即可: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
jstack:
打开cmd进入jdk的bin路径
输入命令,jstack (pid)>stack.txt即可将堆栈信息输入到jdk的bin路径下的stack.txt文件中。
jvisualvm:
双击jvisualvm.exe选择对应pid的客户端进程即可连接,可查看内存信息和堆栈信息等,可生成dump查看内存的详细信息。
客户端卡的原因主要有:等待服务端返回,死锁,死循环,内存不足等。
如何判断客户端在等待服务端返回呢?
如下图:找到AWT-EventQueue-2这个线程(EAS客户端主线程),查看堆栈,如果停在socketRead()说明正在等待服务端返回数据。
死锁如何检测?
1. jconsole中检测到死锁按钮,点击即可检测。
2. jstack打印堆栈信息,如果有死锁会展示在堆栈信息的最后面。
死循环如何判断?
死循环只能根据堆栈信息结合代码逻辑去分析。
内存不足如何判断?
使用jconsole和jvisualvm都可看到内存占用情况,还可使用jmap dump内存快照,使用其他工具分析。
二、分析服务端堆栈内存信息
当通过客户端堆栈分析发现是在等待服务端返回时就可以分析服务端的信息了,同一也可也在服务器通过上述的工具分析堆栈、内存、死锁等信息。
EAS服务器上默认部署了获取堆栈信息的jsp网页工具。可打开浏览器通过ip:端口/easportal/tools/threaddump_mi.jsp访问。可看到所有实例的线程堆栈信息,群集部署需放开所有实例的端口才可访问具体实例。
分析方法与客户端基本一致,当发现堆栈卡在sql执行并且停在socketRead()的时说明在等待数据库返回结果。
三、获取数据库sql的执行情况
结合服务端堆栈获取到sql的大致信息,可通过查询正在执行的sql获取具体的信息。已oracle(其它我也不会,遇到自己百度吧)为例:
SELECT c.sql_id,
b.sid oracleID,
b.username 登录Oracle用户名,
b.serial#,
spid 操作系统ID,
paddr,
sql_text 正在执行的SQL,
b.machine 计算机名
FROM v$process a, v$session b, v$sqlarea c
WHERE a.addr = b.paddr
AND b.sql_hash_value = c.hash_value
v$sqlarea中的sql_fulltext字段会记录完整的sql。
通过上个查询获取到sql_id,即可通过以下方式获取执行计划。
select * from table(dbms_xplan.display_cursor('sql_id',null,'advanced allstats last peeked_binds'));
如果想获取更详细的执行计划信息可将sql拷出,先修改STATISTICS_LEVEL再执行sql,然后再收集执行计划
alter session set STATISTICS_LEVEL = ALL; --会话级别
或
alter system set STATISTICS_LEVEL = ALL; --系统级别