定位问题,知识经验是关键基础。
数据是依据,而工具是处理的手段。
在java的bin目录下,sun公司给我们提供了,这些个工具。
image.png
这个工具,很短小犀利,小是因为主要作用是封装到了lib下的tools.jar代码里了。实际的工具是封装的命令行去调用的。
jps
跟linux命令ps功能类似
jstat
查看收集hotspot虚拟机各方面的运行数据
比如参数-gcutil 监视java堆状况,包括Eden区,survivor区,老年代,永久代的容量,已用空间,gc的时间等信息。显示百分比
jstat -gcutil 84099 1000
image.png
jinfo
查看和调整虚拟机的各项参数
jps -v参数可以查看初始化启动时的虚拟机参数。但是有些默认项可能没显示出来,需要使用jinfo去查看。
jmap
java的内存映像工具。
用于生成堆转储快找(dump文件)。
生成dump文件一种方法是,在启动的jvm参数里,使用
-XX:+HeapDumpOnOutOfMemoryError参数,程序在OOM后会自动生成dump文件。
还有一种方法是,是用jmap指令,参数-heap ,-histo 是打印详细的信息。
分析dump文件一般比较耗资源,费时间。
市面上有很多成熟的分析工具,要是要分析,内存泄漏和内存溢出原因的。
jhat
jhat就是分析dump文件的一种工具,但是相对比较简陋些,比较好的方法还是copy到别的地方,是用三方工具去分析,更常见些。
VisualVm,Eclipse Memory Analyzer,IBM heapAnalyzer(mark需要时用)
jstack
java的栈跟踪工具,用于生成虚拟机当前时刻的线程快照(threaddump文件)。线程快照里包含了每个线程的堆栈信息。
生成她的原因是为了定位,导致线程长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间的等待。
除了使用jstack工具外,还有个方法可以打印线程的堆栈信息。
Thread类里有个getAllStackTraces()方法。可以做个工具,调用这个方法来实现分析线程栈信息。
之前文章在排查cpu使用率100%有使用到这个工具,参考: 线上机器cpu占用率100%问题排查。
可视化工具JConsole,VisualVM(mark)
full gc问题排查:
留下线程快照jstack
留下dump内存分配信息jmap
hashmap是线程不安全的。并发环境下,在拓容的情况下会形成环状链表,导致死循环。
参考:《深入理解Java虚拟机》周志明
网友评论