一、引言
我们会发现$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问题
本文档从实战角度出发,介绍jps、jmap、jstack和jstat这四个命令的常用方式。 jps 作用:获取java进程号,是后续命令的基础。 当一台服务器运行多个java进程时,该命令默认只输出进程号和应用名,可能无法区分哪个...
JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx
Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat
NULL 博文链接:https://kennylee26.iteye.com/blog/1402260
jvm相关工具,jmap, jstack,jstat,jconsole等一系列的工具的介绍。很全面。书籍很清晰。
jvm命令参数配置调优讲解,jps,jinfo,jstat,jmap,jstack
1.jps 2.jstack 3.jstat 4.jmap 5.jinfo 6.jcmd 7.jhat
jvm性能调优工具命令大全.zip jps jstat jmap jhat jstack jinfo jps JVM Process Status Tool GChisto jvisualvm ...
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,下面这篇文章主要给大家介绍了关于jvm信息jmap使用的基本方法教程,需要的朋友...
/ 76 4.1 概述 / 76 4.2 JDK的命令行工具 / 76 4.2.1 jps:虚拟机进程状况工具 / 79 4.2.2 jstat:虚拟机统计信息监视工具 / 80 4.2.3 jinfo:Java配置信息工具 / 82 4.2.4 jmap:Java内存映像工具 / 82 4.2.5...
• The jmap Utility • The jps Utility • The jrunscript Utility • The jstack Utility • The jstat Utility • The visualgc Tool • Control+Break Handler • Native Operating System Tools • Custom ...
JVM监控工具介绍:详细介绍jstack, jconsole, jinfo, jmap, jdb, jstat 等命令的使用方法
jvm命令行工具,java性能优化,jdk命令工具, jcmd命令、jps命令、jmap命令、jstack命令、jinfo命令、jstat命令
• 了解JVM性能监控以及调优,会使用jps、jstack、jmap、jstat、jhat,了解内存泄露排查具体方法 • Java基础 • 熟练的使用Java语言进行面向对象程序设计,熟悉Java语言特性 • 熟悉常用排序,堆栈,树等数据结构和...
它囊括的命令行工具包括jps,jstat,jmap,jinfo,jstack,JConsole,这些工具与JDK的标准版本是一致的。 jinfo:可以输出并修改运行时的java进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地...
它囊括的命令行工具包括jstat, JConsole, jstack, jmap 和 jinfo,这些工具与JDK的标准版本是一致的。 可以使用VisualVM生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,同时它还支持在...
2. jstat:虚拟机统计信息监视工具 2 3. jinfo:java配置信息工具 3 4. jhat:虚拟机堆转储快照分析工具 3 5. jmap:内存映像工具 3 6. jstack:java堆栈跟踪工具 3 7. VisualVM:多合一故障处理工具 3 8. jconsole...
3:JVM内存调优:JVM参数【标准参数、-X参数、-XX参数等】+常用命令【jps、jinfo、jstat、jstack、jmap】+常用工具【jconsole、jvisualvm、Arthas、MAT】+性能优化及总结+高并发场景分析+JVM性能优化指南。