注意:

经过观察,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

jstat-gc命令详解_jstat分析内存溢出_jstat

+java栈:

sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack -m 2815

jstat-gc命令详解_jstat_jstat分析内存溢出

jinfo

可看系统启动的参数,如下

sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jinfo -flags 2815

jstat-gc命令详解_jstat_jstat分析内存溢出

jmap

两个用途

1.查看堆的情况

sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -heap 2815

jstat分析内存溢出_jstat_jstat-gc命令详解

jstat分析内存溢出_jstat-gc命令详解_jstat

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-gc命令详解_jstat分析内存溢出

jstat

jstat参数众多,但是使用一个就够了

sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstat -gcutil 2815 1000 

jstat分析内存溢出_jstat_jstat-gc命令详解

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

快捷键一次你记不住,多来几次你总能记住了吧?

jstat-gc命令详解_jstat分析内存溢出_jstat

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

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!