当使用jmap,jstack是用-F参数的时候,是通过调用系统调用ptrace来取的寄存器的信息,关于linux下的ptrace实现可以参考我的博客(http://blog.csdn.net/raintungli/article/details/6563867)
在jdk6u23版本之前你会发现,当你使用jstack -F的时候 经常在logger 里面 看到错误信息,直接抛出异常,根本无法看到堆栈信息。
Thread 26724: (state = BLOCKED)
Error occurred during stack walking:
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:152)
at sun.jvm.hotspot.debugger.....
通过查看源码,最后调用的函数是process_get_lwp_regs /ps_proc.c
无法判断究竟是否是因为没有定义参数PTRACE_GETREGS_REQ,还是因为ptrace的调用参数错误所导致的,这样就必须打开print_debug,查看打印的信息。
通过源码,可以查到print_debug函数是通过环境变量LIBSAPROC_DEBUG来控制
设置
exportLIBSAPROC_DEBUG=1
运行
jstack -F processid
我们能看到错误中多了一行
产生的原因就非常清楚了,bug主要是因为宏定义PTRACE_GETREGS_REQ缺失,查看源码
_LP64 是64位机器的宏定义,而对ptrace的参数PTRACE_GETREGS64,显然Linux kernel 2.6.35里面并没有支持,导致了没有宏定义PTRACE_GETREGS_REQ,这里明显是jvm没有考虑到的情况。
解决办法
a. 因为这是jvm 编译级别的bug,除非你重现修改编译libsaproc.so,覆盖目录/jdk1.6.0_23/jre/lib/amd64
笔者自己编译了这个lib,可以在csdn上下载(http://download.csdn.net/detail/raintungli/4065304),笔者编译的jdk版本是1.6.23 build(19.0)
b. 建议升级jvm到1.6.30版本,该版本已经测试过,已经修复该bug.
后话:
jvm可以在此处更清楚点,不是简单的判断<0,而是在判断<0的时候把errno打印出来,能更容易的判断出是什么原因无法ptrace 上。
分享到:
相关推荐
java程序性能分析thread dump和heap dump,dump文件:在故障定位(尤其是out of memory)和性能分析的时候,dump文件记录了JVM运行期间的内存占用、线程执行等情况。 heap dump:记录某一时刻JVM堆中对象使用情况,哪些...
Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx
java使用JMAP定位代码内存泄漏
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx
java应用运行过程中难免会出现问题,特别是在生产环境,发生异常或宕机情况,需要诊断与分析,定位原因,进行优化,避免下次再次出现问题。 虽然现在有很多可视化工具,使用起来比命令行更方便,但我们仍需要对基本...
jmap、jstack、jstat组合使用定位jvm问题
JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc
Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat
详细请看: Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug的解决lib (http://blog.csdn.net/raintungli/article/details/7245709) 自己编译的,测试能够通过
通过jstack与jmap分析一次线上故障.pdf
java监控工具源码-可集成到项目使用 内存状态、CPU负载、磁盘IO吞吐率、磁盘健康状态、网卡IO 监控 适合用于服务健康监控、线上调优、排查问题、性能测试等场景 支持操作系统监控:内存状态、CPU负载、磁盘IO及吞吐...
java dump分析工具,分析内存溢出,jmap dump文件分析,jstack堆栈分析
jvm命令参数配置调优讲解,jps,jinfo,jstat,jmap,jstack
NULL 博文链接:https://kennylee26.iteye.com/blog/1402260
jmap 内存分析可视化工具,无须破解,解压即用。小编亲测。
基本上出问题就是 df、free、top,然后依次 使用jstack、jmap,具体问题具体分析。 IBM出的一款堆内存对象分析ha(heap analyser)工具,可以用来分析websphere生成的内存转储phd格式文件。 使用方法 1.下载ha457.jar ...
6. jstack:java堆栈跟踪工具 3 7. VisualVM:多合一故障处理工具 3 8. jconsole: 略 3 9. Memory Analyzer Tool(MAT)Eclipse插件 3 二、 JVM参数 3 1. 调试参数 3 2. 调优参数 4 3. 行为参数 4 4. 启动参数 5 三...
本篇文章主要通过代码实例对java自带命令行工具jmap、jhat与jinfo的使用做出了详解,需要的朋友可以参考下
用于分析Java内存溢出,或者内存泄露,需要配合jmap dump出内存文件
Java自带了许多诊断工具,例如JConsole、JVisualVM、jmap、jstack、jcmd等。这些工具都是非常常用的工具,它们可以帮助开发人员诊断Java应用程序的性能问题。其中,JConsole和JVisualVM是图形化工具,可以用来监控...