`
小滔哥
  • 浏览: 58669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

jmap/jstack/jstat等等从何而来

 
阅读更多

一、引言

    我们会发现$JAVA_HOME/bin/目录下的java,jmap,jstack,jstat,jinfo等等都是二进制的文件,而我们又很容易发现,java是与一个源文件java.c对应的,却看不到jmap,jstack,jstat等对应的源文件,那么这些工具又是怎么生成的呢,下面介绍下我是如何发现这些工具是怎样生成的,以jmap为例。

二、以jmap为例,介绍这些工具如何生成的。

    首先想到的是,build整个openjdk,然后根据build信息查找jmap是如何生成的。

    build openjdk ,这里有个详细的参考,rednaxelafx大神的作品。按照整个build过程,build出来openjdk,然后保存了build过程中的build信息,在这个build信息中搜索了下jmap,找到了下面信息。

build jmap 写道
cd ../launchers && make -f Makefile.launcher PROGRAM=jmap MAIN_CLASS=sun.tools.jmap.JMap MAIN_JAVA_ARGS="-J-Dsun.jvm.hotspot.debugger.useProcDebugger -J-Dsun.jvm.hotspot.debugger.useWindbgDebugger" MAIN_ARGS=""
make[5]: Entering directory `/home/chengtao/Downloads/openjdk7/openjdk/jdk/make/launchers'
=========================================================
LAUNCHER: jmap
MAIN_CLASS: sun.tools.jmap.JMap
MAIN_JAVA_ARGS: -J-Dsun.jvm.hotspot.debugger.useProcDebugger -J-Dsun.jvm.hotspot.debugger.useWindbgDebugger
ALL_ARGS: -J-ms8m -J-Dsun.jvm.hotspot.debugger.useProcDebugger -J-Dsun.jvm.hotspot.debugger.useWindbgDebugger sun.tools.jmap.JMap
 

  从这里面,我们可以看到,jmap或许是在这里生成的,但是我们有看不到gcc的编译信息,不知道是如何生成的,因此我进到了`/home/chengtao/Downloads/openjdk7/openjdk/jdk/make/launchers这个目录,执行了下上面的命令

make 写道
chengtao@ubuntu:~/Downloads/openjdk7/openjdk/jdk/make/launchers$ make -f Makefile.launcher PROGRAM=jmap MAIN_CLASS=sun.tools.jmap.JMap MAIN_JAVA_ARGS="-J-Dsun.jvm.hotspot.debugger.useProcDebugger -J-Dsun.jvm.hotspot.debugger.useWindbgDebugger" MAIN_ARGS=""

 输出了下面信息

 

make output 写道
=========================================================
LAUNCHER: jmap
MAIN_CLASS: sun.tools.jmap.JMap
MAIN_JAVA_ARGS: -J-Dsun.jvm.hotspot.debugger.useProcDebugger -J-Dsun.jvm.hotspot.debugger.useWindbgDebugger
ALL_ARGS: -J-ms8m -J-Dsun.jvm.hotspot.debugger.useProcDebugger -J-Dsun.jvm.hotspot.debugger.useWindbgDebugger sun.tools.jmap.JMap
=========================================================
/usr/bin/gcc -g -fno-strict-aliasing -fPIC -W -Wall -Wno-unused -Wno-parentheses -pipe -fno-omit-frame-pointer -D_LITTLE_ENDIAN -DNDEBUG -DARCH='"amd64"' -Damd64 -DLINUX -DRELEASE='"1.7.0-internal"' -DFULL_VERSION='"1.7.0-internal-chengtao_2012_11_20_22_47-b00"' -DJDK_MAJOR_VERSION='"1"' -DJDK_MINOR_VERSION='"7"' -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_REENTRANT -D_LP64=1 -I. -I../../build/linux-amd64/tmp/sun/launcher/jmap/CClassHeaders -I../../src/solaris/javavm/export -I../../src/share/javavm/export -I../../src/share/bin -I../../src/solaris/bin -I../../src/share/native/java/util/zip/zlib-1.1.3 -DAPP_CLASSPATH='{ "/lib/tools.jar", "/lib/sa-jdi.jar", "/classes" }' -DMAIN_CLASS='"sun.tools.jmap.JMap"' -DJAVA_ARGS='{ "-J-ms8m", "-J-Dsun.jvm.hotspot.debugger.useProcDebugger", "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger", "sun.tools.jmap.JMap", }' -DLAUNCHER_NAME='"openjdk"' -DPROGNAME='"jmap"' -c -o ../../build/linux-amd64/tmp/sun/launcher/jmap/obj64/main.o \
-DRELEASE='"1.7.0-internal"' -DFULL_VERSION='"1.7.0-internal-chengtao_2012_11_20_22_47-b00"' -DJDK_MAJOR_VERSION='"1"' -DJDK_MINOR_VERSION='"7"' ../../src/share/bin/main.c
Rebuilding ../../build/linux-amd64/bin/jmap because of ../../build/linux-amd64/tmp/sun/launcher/jmap/obj64/main.o
/usr/bin/gcc -o ../../build/linux-amd64/bin/jmap -Xlinker -g -Xlinker -version-script=../java/main/java/mapfile-amd64 -Wl,--hash-style=both -Xlinker -z -Xlinker defs -L../../build/linux-amd64/lib/amd64 -Wl,-soname=lib.so -L ../../build/linux-amd64/lib/amd64/jli -Wl,--allow-shlib-undefined -Wl,-rpath -Wl,\$ORIGIN/../lib/amd64/jli -Wl,-rpath -Wl,\$ORIGIN/../jre/lib/amd64/jli \
../../build/linux-amd64/tmp/sun/launcher/jmap/obj64/main.o -lpthread -ljli -ldl -lc
/usr/bin/ld: cannot find -ljli

  从这里我们就很容易发现了,jmap是通过编译../../src/share/bin/main.c文件生成的,接下来,我们就来分析下这个文件。

 

    return JLI_Launch(margc, margv,
                   sizeof(const_jargs) / sizeof(char *), const_jargs,
                   sizeof(const_appclasspath) / sizeof(char *), const_appclasspath,
                   FULL_VERSION,
                   DOT_VERSION,

 这个文件里,只出现了这么一个语句, JLI_Launch这个函数则来自于java.c中定义,后面就跟java.c的逻辑是一样的了。至此,我们就清楚了jmap是如何来的。

 

三、jstack,jstat,jinfo等等的生成

    通过jmap的分析,我们不难知道这几个工具是如何来的了。这些工具的生成,依赖两个makefile,openjdk/jdk/make/launchers这个目录下的Makefile和Makefile.launch,在Makefile.launch文件中为各种工具定义了相应的变量值,而当gcc编译的时候,传递过去。在 ../../src/share/bin/main.c中依赖了,defines.h

#ifndef APP_CLASSPATH
#define APP_CLASSPATH        { "/lib/tools.jar", "/classes" }
#endif /* APP_CLASSPATH */
static const char* const_appclasspath[] = APP_CLASSPATH;
#else  /* !JAVA_ARGS */
#ifdef PROGNAME
static const char* const_progname = PROGNAME;
#else
static char* const_progname = NULL;
#endif

  到这里,我们就清楚了所有工具是如何生成的了,makefile中的变量值与生成的工具是一一对应的,例如生成jstack,传递jstack需要的PROGNAME,APP_CLASSPATH变量就可以了。这里的技巧就是只需要一个main.c,通过makefile中的变量,控制main.c中需要的变量的值,就可以生成多个工具了。

 

分享到:
评论

相关推荐

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

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

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

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

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx

    JVM性能调优监控工具jps、jstack、jmap、jhat、...jps、jstack、jmap、jhat、jstat 等 JVM 性能调优监控工具对于 Java 程序员来说是必备的,能够帮助我们解决各种 JVM 性能问题,提高 Java 应用程序的性能和稳定性。

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

    本文将深入探讨六种关键的JVM监控工具——`jstack`, `jconsole`, `jinfo`, `jmap`, `jdb`, `jstat`——它们各自的功能、应用场景及如何帮助开发者和运维人员诊断并解决JVM中的复杂问题。 #### 1. jstack —— Java ...

    JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    jmap是一个命令行工具,用于从Core文件或进程中获取内存的具体匹配情况,包括Heap size、Perm size等等。jmap工具目前仅在Solaris和Linux的JDK版本中提供。 jdb jdb是一个命令行工具,用于对Core文件和正在运行的...

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

    本篇将重点介绍几种常用的JVM监控工具,包括jstack、jconsole、jinfo、jmap以及jdb和jstat。 首先,`jstack`是一个用于打印Java线程堆栈跟踪的工具。当应用出现死锁或者线程阻塞时,jstack可以帮助我们查看各个线程...

    linux切换JDK脚本

    --slave /usr/bin/jstack jstack /opt/jdk1.6.0_11/bin/jstack --slave /usr/bin/jstat jstat /opt/jdk1.6.0_11/bin/jstat --slave /usr/bin/jstatd jstatd /opt/jdk1.6.0_11/bin/jstatd --slave /usr/bin/...

    java性能调优工具命令大全.zip

    jvm性能调优工具命令大全.zip jps jstat jmap jhat jstack jinfo jps JVM Process Status Tool GChisto jvisualvm ...

    Java线上故障排查方案.pdf

    3. 终端命令监控(Terminal Command Monitoring):通过执行特定的命令,例如使用jps、jmap、jstack、jinfo、jstat等JDK自带工具,可以获取Java虚拟机(JVM)的运行状态信息。 4. 内存分析工具(Memory Analysis ...

    JVM性能调优监控工具1

    本文将详细介绍几个常用的JVM性能监控工具及其功能,包括Jinfo、Jstat、Jmap和Jstack。 1. **Jinfo**: Jinfo是一款用于查看和修改Java进程配置参数的命令行工具。它可以帮助开发者了解正在运行的Java应用程序的...

    JDK自带调试工具doc

    本篇将详细介绍JDK自带的几个主要调试工具,包括`jmap`、`jstack`、`jconsole`,以及相关的文档资源。 1. `jmap`:这是一个用于诊断堆内存状况的工具。通过`jmap`,我们可以获取到堆内存的详细映射,包括对象分配...

    JVM命令行监测工具详解

    为了监控和调试JVM的运行状态,Oracle提供了多个命令行工具,包括jps、jstack、jstat、jmap和jcmd。这些工具可以帮助开发者了解和解决性能问题,优化应用程序。 一、jps (Java Process Status) jps是查看当前系统中...

    JVM监控工具介绍.docx

    例如,如果需要快速定位内存泄漏,可以使用`jmap -histo` 或者结合`jstat -gc` 和`jmap -heap`。如果关心线程状态,`jstack` 是首选。对于整体性能的可视化监控,`jconsole` 是个不错的选择。熟练掌握这些工具的使用...

    Troubleshooting Guide for Java

    本文将详细介绍多种Java调试工具及其使用方法,并通过实例演示如何利用这些工具来定位并解决常见的Java应用问题。 #### 一、诊断工具概述 在深入探讨具体的调试工具之前,我们首先简要介绍Java平台提供的诊断工具。...

    10.JVM常见命令1

    在本文中,我们将介绍 10 个常见的 JVM 命令,包括 jps、jstat、jinfo、jmap 和 jstack 等。 jps 命令 jps 命令是 JVM 进程状态工具,用于显示指定系统内所有的 HotSpot 虚拟机的进程状态。它可以列出当前运行在...

    jdk命令行工具.doc

    jvm命令行工具,java性能优化,jdk命令工具, jcmd命令、jps命令、jmap命令、jstack命令、jinfo命令、jstat命令

    VisualVM简介

    VisualVM 是一款强大的 Java 应用程序监控和诊断工具,它集成了一系列的 JDK 命令行工具,如 jps、jstat、jinfo、jmap、jstack 和 jhat,提供了一个统一的图形用户界面,方便开发者深入了解 Java 应用程序的运行状况...

    jvm监控工具介绍

    为了有效地监控和调试Java应用程序,Oracle JDK提供了多种强大的命令行工具,如jconsole、jmap、jstat等。下面将详细解释这些工具的功能和使用场景。 1. **jstack**: jstack是一种用于生成Java线程堆栈跟踪的工具...

    Java内存泄露_JVM监控工具介绍

    jmap命令可以从core文件或进程中获得内存的具体匹配情况,包括Heap size、Perm size等等信息。jmap命令可以帮助开发者快速地了解Java应用程序的内存使用情况,从而快速定位问题所在。 五、jdb命令 jdb命令是一个...

    JAVA JVM内存监控工具总结

    它包含的工具如jps、jstat、jmap、jinfo、jstack和JConsole,都是JDK的标准组成部分,帮助开发者深入理解JVM的内存状态。 1. **jps (Java Virtual Machine Process Status Tool)** 类似于Unix系统中的`ps`命令,...

Global site tag (gtag.js) - Google Analytics