当使用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 上。
分享到:
相关推荐
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...
在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法使用 jmap 和 jstack 命令。 解决方案: 1. 了解 Linux 特殊进程 在 ...
JMAP是Java自带的一个命令行工具,它提供了对Java堆内存的详细分析功能,可以帮助我们诊断内存泄漏。JMAP的主要功能包括: 1. **生成堆转储文件**:通过`jmap -dump:format=b,file=<filename> <pid>`命令,我们可以...
本文将介绍五种JVM监控工具:jstack、jconsole、jinfo、jmap和jdb。 jstack jstack是一款命令行工具,用于生成Java应用程序的崩溃dump文件的信息。该工具可以attach到正在运行的Java应用程序中,查看当前运行的...
上述工具共同构成了Java开发者和运维人员的有力武器库,帮助他们在面对复杂多变的JVM问题时能够迅速定位、分析并解决问题。每一种工具都有其独特的优势和适用场景,了解并熟练运用它们,将极大地提升处理Java应用...
本文主要介绍了四个Java命令行工具:jps、jmap、jstack和jstat,它们是Java性能分析和故障排查的基础。 1. **jps (Java Process Status)**: 用于查看运行在本地机器上的Java进程ID,这对于其他命令来说是必需的输入...
4. **其他开发工具**:OpenJDK 1.8.0还包括其他的开发工具,如`jmap`用于内存映射,`jhat`用于分析堆转储,`jinfo`获取Java配置信息,`jstack`用于查看线程堆栈跟踪,以及`jconsole`图形化监控工具等。这些工具对于...
jmap、jstack、jstat组合使用定位jvm问题
`jinfo`工具主要用于获取和修改Java进程的配置信息,如JVM参数。例如,我们可以通过`jinfo -flag <flag> <pid>`查看某个Java进程是否启用了特定的JVM标志,或者使用`jinfo -flags <pid>`列出所有有效的JVM标志。 `...
241"是JDK的实际安装目录,包含了所有必要的库、工具和头文件,如Java编译器(javac)、Java解释器(java)、Java运行时环境(JRE)、Java类库以及开发工具如Java文档生成器(javadoc)和性能分析器(jmap)等。...
在Linux环境下,开发者还可以利用JDK的命令行工具,如`jps`查看Java进程,`jstat`监控JVM统计信息,`jmap`用于内存映射,以及`jstack`用于生成线程堆栈跟踪,这些都是进行性能调优和问题排查的重要工具。 总的来说...
6. **开发者工具和库**:包括调试器(jdb)、性能分析器(jvisualvm)、内存分析工具(jmap, jhat)等,以及大量的Java标准库(如IO、网络、集合框架等)。 在Linux环境下,JDK的安装通常涉及以下步骤: 1. 解压...
Java OpenJDK 1.8 for Linux 是一个广泛使用的Java开发和运行环境,尤其在CentOS 7.5操作系统上。这个版本的JDK(Java Development Kit)是Oracle公司发布的一个开源实现,它包含了编译、调试、运行Java应用程序所需...
详细请看: Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug的解决lib (http://blog.csdn.net/raintungli/article/details/7245709) 自己编译的,测试能够通过
在Linux系统上,你可以通过命令行直接调用这些工具,例如`javac HelloWorld.java`来编译名为`HelloWorld.java`的源文件。 总结来说,JDK是Java编程的基础,它提供了开发和运行Java程序所需的一切。"jre-8u321-linux...
**jmap Eclipse内存分析工具详解** 在Java开发中,内存管理是至关重要的,尤其是在大型应用或者长时间运行的服务中,内存泄漏可能导致系统性能下降甚至崩溃。为了有效地检测和诊断内存问题,Oracle提供了`jmap`...
JDK是Java开发的核心组成部分,包含了Java编译器(javac)、Java运行时环境(JRE)、调试工具(如jdb和jconsole)、性能分析工具(如jmap和jhat)以及许多其他实用工具。对于开发者而言,它是构建、测试和运行Java...
这包括监控JVM性能(通过jstat、jmap、jstack等工具)、调整JVM参数(如-Xms、-Xmx、-XX:MaxHeapSize等)以及处理常见的内存溢出问题。此外,JDK 8u321还包括了安全性更新和性能优化,因此定期升级到最新版本对于...
同时,JDK还包含`javadoc`工具用于生成API文档,`jps`、`jstack`、`jmap`等用于监控和诊断Java进程。 总之,"最新Java JDK 8安装版(Linux 64位)"为Linux开发者提供了稳定可靠的开发环境,结合其新特性和改进的API...