欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM问题定位工具

程序员文章站 2022-04-12 13:15:12
...

JDB

JDB是基于文本和命令行的调试工具,Jikes在JDB的基础上提供了GUI。熟悉JDB还是有价值的,很多情况下需要我们在命令行下完成简单的debug问题定位。

1
2
3
jdb -classpath bin com.xx.Example
jdb -connect com.sun.jdi.SocketAttach:hostname=myhost,port=8000
jdb -connect "com.sun.jdi.CommandLineLaunch:main=Hello 1 2 3"

我们可能更熟悉使用下面这样的方式来进行调试,但本质上就是在使用JDB:

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9000

很多人都知道使用它可以连接上JVM进行远程调试,但是并不清楚这些参数的含义都是什么。那么你可以阅读一下JPDA的文档,JPDA是一种用于虚拟机和调试器之间消息传输的方式,二者谁都可以成为server,另一者则成为client。Sun发布了两种实现,一种是基于TCP/IP的(Socket传输),另一种是基于共享内存的(共享内存传输)。

  • Socket传输:这也是我们最常用的调试方式,其中的命令定义和响应包的定义请参阅这两个文档JDWP规格JDWP传输接口。这就是参数中transport=dt_socket的含义。
  • 共享内存传输:参数需要改成transport=dt_shmem。这种模式只支持Windows平台,当然,客户端和服务端当然在一台机器上。

Sun虚拟机实现需要指定命令行选项,以加载JDWP(Java Debug Wire Protocol Transport)代理来debug。JDK 5.0以前需要指定-Xdebug和-Xrunjdwp这两个参数,以后则可以使用参数-agentlib:jdwp替代之,它们指定了JVM使用的连接器。从上面的例子代码可以看到几个jdwp支持的参数选项,包括transport、server、suspend、address等等,这些都很常见,还包括timeout、launch(中断并开始调试的时候,执行什么程序)、onuncaught(如果出现无法捕获的异常是否需要中断并调试)等等。

1
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub

这段参数是说,在抛出IO异常时,中断并执行debugstub。

早些时候JVM曾经因为开放这样的debug端口,遇到远程扫描,虚拟机发生崩溃,参见bug链接

VisualVM和JConsole

VisualVM这个工具来自Netbeans的项目,JVM的运行情况一目了然。它已经被收录到JDK的官方工具中去了,官网上面可以找到很多插件,这是这个工具尤其出色的地方。

JConsole也集成在JDK的工具中,图形化地监视虚拟机的状态。

jinfo/jmap/jhat/jstack/jstat

这几个命令行工具可以很方便地查看当前虚拟机的参数信息、堆、内存图、线程堆栈和垃圾回收信息,它们非常常用,不需要预先使用参数增加虚拟机开启的端口。其中,jhat命令尤其强大,它可以把堆中的对象导出成为html文件,比较两次虚拟机快照的不同,同时还支持对象查询语句来查询堆中对象的状态。

JProfiler和Optimizeit

JProfilerOptimizeit一样,都是综合性的性能剖析工具,甚至可以分析不同方法的CPU时间占用,帮助找出CPU热点。

GCView,HP Jmeter,Garbage Cat和GC Analyzer

这几个是GC日志分析工具。

IBM HeapAnalyzer和MemoryAnalyzer

IBM HeapAnalyzerMemoryAnalyzer都是dump文件分析工具,可以观察不同对象的数量,对象之间的引用关系等等,可以协助发现内存泄露点。说明一下,我们需要把core文件和dump文件区分清楚。dump文件是堆内存的映像信息,相当于把内存中存放的对象映射到一个文件里,这个文件通常会比较大;而core文件是当前的线程栈信息,是可以使用kill -3命令生成的,也可以使用jstack命令获取。

BTrace

Btrace是一种安全和动态的跟踪分析工具,功能非常强大,可以动态分析Java程序是怎么执行的。原理是在运行时把系统中的某些类替换成包含跟踪代码的类(字节码跟踪),而跟踪代码也是用Java语言完成的。

总的来说,通常监控型的工具功能最强大,但是对系统资源要求也很高,对于生产环境上特有的问题,还是多考虑使用一些快照工具,内存和CPU占用小,系统中断时间短。

文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》

相关标签: 工具 性能