`

Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug

 
阅读更多

当使用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使用详解.docx

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...

    Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx

    在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法使用 jmap 和 jstack 命令。 解决方案: 1. 了解 Linux 特殊进程 在 ...

    java使用JMAP定位代码内存泄漏在哪

    JMAP是Java自带的一个命令行工具,它提供了对Java堆内存的详细分析功能,可以帮助我们诊断内存泄漏。JMAP的主要功能包括: 1. **生成堆转储文件**:通过`jmap -dump:format=b,file=&lt;filename&gt; &lt;pid&gt;`命令,我们可以...

    JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    本文将介绍五种JVM监控工具:jstack、jconsole、jinfo、jmap和jdb。 jstack jstack是一款命令行工具,用于生成Java应用程序的崩溃dump文件的信息。该工具可以attach到正在运行的Java应用程序中,查看当前运行的...

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc

    上述工具共同构成了Java开发者和运维人员的有力武器库,帮助他们在面对复杂多变的JVM问题时能够迅速定位、分析并解决问题。每一种工具都有其独特的优势和适用场景,了解并熟练运用它们,将极大地提升处理Java应用...

    java诊断与调优常用命令jmap、jstack、jstat使用实战.pdf

    本文主要介绍了四个Java命令行工具:jps、jmap、jstack和jstat,它们是Java性能分析和故障排查的基础。 1. **jps (Java Process Status)**: 用于查看运行在本地机器上的Java进程ID,这对于其他命令来说是必需的输入...

    亲测可用java-1.8.0-openjdk.linux.x86_64.zip

    4. **其他开发工具**:OpenJDK 1.8.0还包括其他的开发工具,如`jmap`用于内存映射,`jhat`用于分析堆转储,`jinfo`获取Java配置信息,`jstack`用于查看线程堆栈跟踪,以及`jconsole`图形化监控工具等。这些工具对于...

    jmap、jstack、jstat组合使用定位jvm问题.txt

    jmap、jstack、jstat组合使用定位jvm问题

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    `jinfo`工具主要用于获取和修改Java进程的配置信息,如JVM参数。例如,我们可以通过`jinfo -flag &lt;flag&gt; &lt;pid&gt;`查看某个Java进程是否启用了特定的JVM标志,或者使用`jinfo -flags &lt;pid&gt;`列出所有有效的JVM标志。 `...

    jdk-8u241-linux-arm64-vfp-hflt.tar.gz

    241"是JDK的实际安装目录,包含了所有必要的库、工具和头文件,如Java编译器(javac)、Java解释器(java)、Java运行时环境(JRE)、Java类库以及开发工具如Java文档生成器(javadoc)和性能分析器(jmap)等。...

    最新版linux jdk-8u301-linux-x64.tar.gz

    在Linux环境下,开发者还可以利用JDK的命令行工具,如`jps`查看Java进程,`jstat`监控JVM统计信息,`jmap`用于内存映射,以及`jstack`用于生成线程堆栈跟踪,这些都是进行性能调优和问题排查的重要工具。 总的来说...

    jdk8 java8 linux版 jdk-8u162-linux-x64.tar.zip

    6. **开发者工具和库**:包括调试器(jdb)、性能分析器(jvisualvm)、内存分析工具(jmap, jhat)等,以及大量的Java标准库(如IO、网络、集合框架等)。 在Linux环境下,JDK的安装通常涉及以下步骤: 1. 解压...

    java-openjdk1.8-linux.tar.gz

    Java OpenJDK 1.8 for Linux 是一个广泛使用的Java开发和运行环境,尤其在CentOS 7.5操作系统上。这个版本的JDK(Java Development Kit)是Oracle公司发布的一个开源实现,它包含了编译、调试、运行Java应用程序所需...

    jdk1.6.23 libsaproc.so linux 下amd64架构

    详细请看: Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug的解决lib (http://blog.csdn.net/raintungli/article/details/7245709) 自己编译的,测试能够通过

    jre-8u321-linux-x64(linux_jdk安装包)

    在Linux系统上,你可以通过命令行直接调用这些工具,例如`javac HelloWorld.java`来编译名为`HelloWorld.java`的源文件。 总结来说,JDK是Java编程的基础,它提供了开发和运行Java程序所需的一切。"jre-8u321-linux...

    jmap Eclipse内存分析工具.rar

    **jmap Eclipse内存分析工具详解** 在Java开发中,内存管理是至关重要的,尤其是在大型应用或者长时间运行的服务中,内存泄漏可能导致系统性能下降甚至崩溃。为了有效地检测和诊断内存问题,Oracle提供了`jmap`...

    最新版linux jdk-8u291-linux-x64.tar.gz

    JDK是Java开发的核心组成部分,包含了Java编译器(javac)、Java运行时环境(JRE)、调试工具(如jdb和jconsole)、性能分析工具(如jmap和jhat)以及许多其他实用工具。对于开发者而言,它是构建、测试和运行Java...

    jdk-8u321-linux-aarch64.tar.gz

    这包括监控JVM性能(通过jstat、jmap、jstack等工具)、调整JVM参数(如-Xms、-Xmx、-XX:MaxHeapSize等)以及处理常见的内存溢出问题。此外,JDK 8u321还包括了安全性更新和性能优化,因此定期升级到最新版本对于...

    最新Java JDK 8安装版(Linux 64位)

    同时,JDK还包含`javadoc`工具用于生成API文档,`jps`、`jstack`、`jmap`等用于监控和诊断Java进程。 总之,"最新Java JDK 8安装版(Linux 64位)"为Linux开发者提供了稳定可靠的开发环境,结合其新特性和改进的API...

Global site tag (gtag.js) - Google Analytics