JVM问题定位工具

标签: Virtual Machine 工具 性能 | 发表时间:2013-07-23 01:01 | 作者:四火
出处:http://www.raychase.net

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

JVM问题定位工具 JDB

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

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:

-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(如果出现无法捕获的异常是否需要中断并调试)等等。

-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占用小,系统中断时间短。

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

分享到:
你可能也喜欢:

相关 [jvm 问题 工具] 推荐:

JVM问题定位工具

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. JDB是基于文本和命令行的调试工具,Jikes在JDB的基础上提供了GUI. 熟悉JDB还是有价值的,很多情况下需要我们在命令行下完成简单的debug问题定位. 我们可能更熟悉使用下面这样的方式来进行调试,但本质上就是在使用JDB:.

JVM CPU 使用率高 问题两则

- - 码蜂笔记
最近有两个系统先后被恶意扫描,出现 CPU 使用率高的现象. CPU 使用率很高,首先是要找出 CPU 在执行什么样的代码,然后在分析这些代码有什么问题. 1、 用命令 “ps aux | grep APP” 找出应用的进程 id:. 2、 找出耗CPU的线程,在Linux系统下用命令: “ top –H –p pid ”, pid 就是前面找出来的应用进程 ID.

线上JVM调查工具:JCPU和JMEM

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. 之前的jkiller改名为jcpu,然后再加上jmem,齐活了,线上要再遇到问题,内存和CPU之外的也没啥其他办法了. 用来定位莫名其妙的堆外内存问题. 首先还是要先用jmap之类的看清楚是否是JVM堆内问题了再用此神物. jmem.sh 用来靠gdb找到够大的内存块,直接dump到文件里.

java.util.zip.Deflater使用不当引发jvm crash及问题排查

- - Linux - 操作系统 - ITeye博客
最近使用第三方开源库jflvlib录制flv格式视频,测试过程发现,视频录制进程经常挂掉;. java启动参数中已经配置内存溢出时导出日志文件-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/xxx.dump和jvm crash的日志输出路径-XX:ErrorFile=/export/Logs/xxx.log,但是进程挂掉后没有找到任何日志输出;.

64位JVM带来的问题及解决方案

- - Java译站
这篇文章会检验你有关JVM的知识以及项目交付相关的技能;尤其是涉及到JVM升级的时候. 期待你们的评论及回复,一起探讨下如何规避这类的项目可能产生的性能问题. 最近碰到了一个影响到线上生产环境的问题,我们使用的是WebLogic 10以及32位的Hotspot JVM 1.6. 鉴于目前的一些问题以及未来负载上升的预测,我们决定将HotSpot JVM 1.6升级成64位的.

JVM 调优 —— GC 长时间停顿问题及解决方法

- - ImportNew
垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况发生. 并发模式失败(concurrent mode failure). 在 CMS 启动过程中,新生代提升速度过快,老年代收集速度赶不上新生代提升速度.

关于JVM(JDK),Tomcat,Linux的最大线程数问题

- - 孟飞阳的博客
一、JVM(JDK)最大线程数. JVM最大创建线程数量由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响. -Xmx  最大堆内存.

jvm 在docker中内存占用问题探索 | Truman's Blog

- -
jvm 在docker中内存占用问题探索. 最近有个项目在PRD上部署,因为涉及到读取大量数据,会出现内存占用. 为了避免因为该项目影响线上其他服务,所以设置了-m=2048,结果发现运行会超过这个值,docker 进程即将该container killed.. 随后设置了好几个级别,直到-m=6048,依然无法避免container 被干掉.

jvm 性能调优工具之 jmap - 简书

- -
命令jmap是一个多功能的命令. 它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列. pid:需要打印配置信息的进程ID. executable:产生核心dump的Java可执行文件. core:需要打印配置信息的核心文件.

JVM性能调优监控工具专题二:VisualVM基本篇之监控JVM内存,CPU,线程

- - ITeye博客
        上一个专题中讲述了JVM中自带的各种性能测试的小工具:包括jps,jstatck,jmap,jhat,jsats,hprof.         这样会造成不必要的麻烦,难道就没有一个tool可以 包括如上所有的功能. 答案是有的,自从 JDK 6 Update 7以后,提供了一全新的性能检测工具:VisualVM,VisualVM对运行中的Java应用提供了可视化的信息展示, 它是很多工具的整合包,整合了JConsole,jstat,jinfo,jstack以及jmap.