注意:
经过观察,1.3.9的输出不稳定,要多触发几次才能看到正确的结果
正则表达式匹配trace类时范围一定要控制,否则极有可能出现跑满CPU导致应用卡死的情况
由于是字节码注入的原理,想要应用恢复到正常情况,需要重启应用。
Greys
说几个挺棒的功能(部分功能和重合):
sc -df xxx: 输出当前类的详情,包括源码位置和结构
trace class : 相当喜欢这个功能! 很早前可以早看到这个功能。打印出当前方法调用的耗时情况,细分到每个方法。
就说一个功能
:通过修改了字节码,改变了类的内容,即时生效。 所以可以做到快速的在某个地方打个日志看看输出,缺点是对代码的侵入性太大。但是如果自己知道自己在干嘛,的确是不错的玩意儿。
其他功能Greys和都能很轻易做的到,不说了。
之前判断许多问题要通过,但是现在Greys和基本都能搞定了。再加上出问题的基本上都是生产环境(网络隔离),所以基本不怎么使用了,但是还是要标记一下。官网请移步
大杀器
可作为的插件,也可作为单独的程序打开。 详情请移步
java三板斧,噢不对,是七把
jps
我只用一条命令:
sudo -u admin /opt/taobao/java/bin/jps -mlvV
普通用法:
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack 2815
+java栈:
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack -m 2815
jinfo
可看系统启动的参数,如下
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jinfo -flags 2815
jmap
两个用途
1.查看堆的情况
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -heap 2815
2.dump
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -dump:live,format=b,file=/tmp/heap2.bin 2815
或者
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -dump:format=b,file=/tmp/heap3.bin 2815
3.看看堆都被谁占了? 再配合和,排查问题简直是如虎添翼
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -histo 2815 | head -10
jstat
jstat参数众多,但是使用一个就够了
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstat -gcutil 2815 1000
jdb
时至今日,jdb也是经常使用的。
jdb可以用来预发debug,假设你预发的是/opt//java/,远程调试端口是8000.那么
sudo -u admin /opt//java/bin/jdb – 8000.
出现以上代表jdb启动成功。后续可以进行设置断点进行调试。具体参数可见官方说明
感觉很多情况下可以看到更好玩的东西,不详细叙述了。 查询资料听说和jmap等工具就是基于它的。
sudo -u admin /opt/taobao/java/bin/java -classpath /opt/taobao/java/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB
更详细的可见R大此贴
of idea
key
快捷键一次你记不住,多来几次你总能记住了吧?
maven
分析maven依赖的好帮手。
VM
1、你的类到底是从哪个文件加载进来的?
-XX:+TraceClassLoading
结果形如[Loaded java.lang.invoke.MethodHandleImpl$Lazy from D:programmejdkjdk8U74jrelib
t.jar]
2、应用挂了输出dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof
jar包冲突
把这个单独写个大标题不过分吧?每个人或多或少都处理过这种烦人的case。我特么下边这么多方案不信就搞不定你?
mvn dependency:tree > ~/dependency.txt
打出所有依赖
mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId
只打出指定和的依赖关系
-XX:+TraceClassLoading
vm启动脚本加入。在启动脚本中可见加载类的详细信息
-verbose
vm启动脚本加入。在启动脚本中可见加载类的详细信息
greys:sc
greys的sc命令也能清晰的看到当前类是从哪里加载过来的
tomcat-classloader-locate
通过以下url可以获知当前类是从哪里加载的curl :8006//?class=org…xs.
其他
dmesg
如果发现自己的java进程悄无声息的消失了,几乎没有留下任何线索,那么dmesg一发,很有可能有你想要的。
sudo dmesg|grep -i kill|less
去找关键字。找到的结果类似如下:
[6710782.021013] java invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0
[6710782.070639] [] ? oom_kill_process+0x68/0x140
[6710782.257588] Task in /LXC011175068174 killed as a result of limit of /LXC011175068174
[6710784.698347] Memory cgroup out of memory: Kill process 215701 (java) score 854 or sacrifice child
[6710784.707978] Killed process 215701, UID 679, (java) total-vm:11017300kB, anon-rss:7152432kB, file-rss:1232kB
以上表明,对应的java进程被系统的OOM 给干掉了,得分为854.解释一下OOM (Out-Of- ),该机制会监控机器的内存资源消耗。当机器内存耗尽前,该机制会扫描所有的进程(按照一定规则计算,内存占用,时间等),挑选出得分最高的进程,然后杀死,从而保护机器。
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666