前面介绍了字节码和类加载。类加载之后是怎么处理的,java命令是怎么启动一个项目并分配内存和空间的。jvm源码中的逻辑是什么样子的。这次主要记录一下JVM源码的编译和调试的过程
1 编译前的准备
OpenJDK源代码由版本控制系统Mercurial维护。首先需要将对应的依赖工具安装好,并将源码拉下来。
安装Mercurial
brew install Mercurial
安装成功以后,将对应的源代码克隆下来。
hg clone http://hg.openjdk.java.net/jdk9/jdk9 YourOpenJDK
要获取完整的OpenJDK Mercurial存储库集,请使用get_source.sh位于根存储库中的脚本
cd YourOpenJDK bash ./get_source.sh
拉去源码的结果如下:
拉取下来的源码结构介绍
拉取下来的源码结构介绍
构建JVM源码还需要一些基本的配置(对于所有的系统)
1 确保GNU make实用程序为3.81版或更高版本,例如,运行“ make -version” 2 安装 Bootstrap JDK。所有OpenJDK构建都需要访问以前发布的称为引导JDK或引导JDK的JDK。 一般规则是,引导JDK必须是JDK先前主要版本的实例。此外,可能需要使用特定更新级别或更高版本的发行版。如果本地有jdk环境并配置了环境变量,可以可以忽略,编译过程会自动寻找。也可以通过--with-boot-jdk来指定
2 编译源码
构建OpenJDK的第一步是确保系统本身具有完成OpenJDK构建所需的一切。设置系统后,通常无需再次执行。
现在,通过运行configure 脚本来构建OpenJDK,该 脚本将尝试查找并验证您是否拥有所需的一切,然后运行 make,例如
bash ./configure make all
开始执行构建
(base) xxx@xxxx:/data/study/jvm$ bash configure Running generated-configure.sh ? ....... ? ==================================================== A new configuration has been successfully created in /data/study/jvm/build/macosx-x86_64-normal-server-release using default settings. ? Configuration summary: * Debug level: release * HS debug level: product * JDK variant: normal * JVM variants: server * OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64 * Version string: 9-internal+0-adhoc.sunx.jvm (9-internal) ? Tools summary: * Boot JDK: java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home) * Toolchain: clang (clang/LLVM from Xcode 8.3.3) * C Compiler: Version 8.1.0 (at /usr/bin/clang) * C++ Compiler: Version 8.1.0 (at /usr/bin/clang++) ? Build performance summary: * Cores to use: 4 * Memory limit: 8192 MB
开始执行编译
make all
执行过程异常中断,异常信息如下:
ERROR: Build failed for target 'all' in configuration 'macosx-x86_64-normal-server-release' (exit code 2) Stopping sjavac server ? === Output from failing command(s) repeated here === * For target hotspot_variant-server_libjvm_objs_compactibleFreeListSpace.o: In file included from /data/study/jvm/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.cpp:1: In file included from /data/study/jvm/hotspot/src/share/vm/precompiled/precompiled.hpp:296: In file included from /data/study/jvm/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.hpp:33: /data/study/jvm/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:167:12: error: instantiation of variable 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::_min_tree_chunk_size' required here, but no definition is available [-Werror,-Wundefined-var-template] return _min_tree_chunk_size; ^ /data/study/jvm/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:293:44: note: in instantiation of member function 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size' requested here return TreeChunk<Chunk_t, FreeList_t>::min_size(); ^ /data/study/jvm/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.cpp:2681:67: note: in instantiation of member function 'BinaryTreeDictionary<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size' requested here fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()), ^ ... (rest of output omitted) ? * All command lines available in /data/study/jvm/build/macosx-x86_64-normal-server-release/make-support/failure-logs. === End of repeated output === ? No indication of failed target found. Hint: Try searching the build log for '] Error'. Hint: See common/doc/building.html#troubleshooting for assistance. ? make[1]: *** [main] Error 2 make: *** [all] Error 2
查询资料后,删除build下内容,重新开始构建编译
bash ./configure --with-extra-cflags="-Wno-error=deprecated-declarations -Werror=nonnull -Wno-undefined-var-template -Wno-error=mismatched-parameter-types -Wno-error=shift-negative-value"
执行结果
........... ? checking if jtreg failure handler should be built... no, missing jtreg checking if the CDS classlist generation should be enabled... yes checking for number of cores... 4 checking for memory size... 8192 MB checking for appropriate number of jobs to run in parallel... 4 checking flags for boot jdk java command ... -Duser.language=en -Duser.country=US checking flags for boot jdk java command for big workloads... -Xms64M -Xmx1600M -XX:ThreadStackSize=1536 checking flags for bootcycle boot jdk java command for big workloads... -Xms64M -Xmx1600M -XX:ThreadStackSize=1536 checking flags for boot jdk java command for small workloads... -XX:+UseSerialGC -Xms32M -Xmx512M -XX:TieredStopAtLevel=1 checking whether to use sjavac... no checking whether to use javac server... yes checking If precompiled header is enabled... yes checking is ccache enabled... no checking if build directory is on local disk... yes checking JVM features for JVM variant 'server'... all-gcs cds compiler1 compiler2 dtrace fprof jni-check jvmci jvmti management nmt services vm-structs configure: creating /data/study/jvm/build/macosx-x86_64-normal-server-release/configure-support/config.status config.status: creating /data/study/jvm/build/macosx-x86_64-normal-server-release/spec.gmk config.status: creating /data/study/jvm/build/macosx-x86_64-normal-server-release/bootcycle-spec.gmk config.status: creating /data/study/jvm/build/macosx-x86_64-normal-server-release/buildjdk-spec.gmk config.status: creating /data/study/jvm/build/macosx-x86_64-normal-server-release/compare.sh config.status: creating /data/study/jvm/build/macosx-x86_64-normal-server-release/Makefile ? ==================================================== A new configuration has been successfully created in /data/study/jvm/build/macosx-x86_64-normal-server-release using configure arguments '--with-extra-cflags='-Wno-error=deprecated-declarations -Werror=nonnull -Wno-undefined-var-template -Wno-error=mismatched-parameter-types -Wno-error=shift-negative-value''. ? Configuration summary: * Debug level: release * HS debug level: product * JDK variant: normal * JVM variants: server * OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64 * Version string: 9-internal+0-adhoc.sunx.jvm (9-internal) ? Tools summary: * Boot JDK: java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home) * Toolchain: clang (clang/LLVM from Xcode 8.3.3) * C Compiler: Version 8.1.0 (at /usr/bin/clang) * C++ Compiler: Version 8.1.0 (at /usr/bin/clang++) ? Build performance summary: * Cores to use: 4 * Memory limit: 8192 MB
开始编译
(base) xxx@xxxx:/data/study/jvm$ make Building target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release' ? ........... ? 15 warnings generated. /data/study/jvm/jdk/src/java.desktop/macosx/native/libsplashscreen/splashscreen_sys.m:397:5: warning: 'objc_registerThreadWithCollector' is deprecated: it does nothing. Define OBJC_SILENCE_GC_DEPRECATIONS=1 to temporarily silence this diagnostic. [-Wdeprecated-declarations] objc_registerThreadWithCollector(); ^ /usr/include/objc/objc-auto.h:245:25: note: 'objc_registerThreadWithCollector' has been explicitly marked deprecated here static OBJC_INLINE void objc_registerThreadWithCollector() { } ^ 1 warning generated. clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated] clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated] Compiling 4 files for BUILD_JIGSAW_TOOLS Stopping sjavac server Finished building target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release'
编译过程中会偶遇一些warning信息。编译之后的结果在build下。我们看下java对应的版本:
(base) xxxx@xxxx:/data/study/jvm/build/macosx-x86_64-normal-server-release$ ./jdk/bin/java -version openjdk version "9-internal" OpenJDK Runtime Environment (build 9-internal+0-adhoc.sunx.jvm) OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.sunx.jvm, mixed mode) (base) xxx@xxx:/data/study/jvm/build/macosx-x86_64-normal-server-release$ pwd /data/study/jvm/build/macosx-x86_64-normal-server-release (base) xxx@xxx:/data/study/jvm/build/macosx-x86_64-normal-server-release$
到这里基本编译就已经结束了~