基于之前面试很多次被问到jvm运行原理及调优问题,以及jvm本身是技能提升不可逾越的一道坎,于是决定深入学习jvm,不久买了周志明的《深入理解java虚拟机--jvm高级特性与最佳实践》一书,拜读学习。写此博客目的1:以前没写过博客,准备以此为开端尝试谢谢;2:记录自己学习历程,同时督促自己不断学习不断提升;3:记录遇到的问题,记录解决的办法和思路,以后重新看时可能会有新的感受。
1.编译环境搭建
可以是win10系统或者LInux系统,因本人工作公司开发环境为win10,于是以win10为搭建系统,具体列表如下:
1)win10
2)cygwin 64位最新版本,别太旧就行
3)freetype 2.7
4)vs2010
5)openjdk8
6)JDK 8 (本地机器安装)
以上安装软件我是参考博主Lynn的博客https://blog.csdn.net/wqlinloveruby/article/details/80409031,非常感谢他,
他整理的链接:https://pan.baidu.com/s/10iD2e7LhtQTPolGVUdOGgg 密码:yjqh
2.软件安装步骤
2.1安装CYGWIN:在Windows平台下模拟Linux运行环境的软件,提供一系列的Linux命令支持;
需要该软件的原因是在编译中要使用GNU Make来执行Makefile文件(参考周志明《深入理解java虚拟机--jvm高级特性与最佳实践》);
注意:安装CYGWIN时不能直接默认安装,因为下表中所示的工具都不会进行默认安装,而它们是编译过程中需要的,所以需要在装界面中进行手工选择。
表1 需要手工选择安装的CYGWIN工具
Binary Name | Category | Package | Description |
---|---|---|---|
ar.exe | Devel | binutils | The GNU assembler, linker and binary utilities |
make.exe | Devel | make | The GNU version of the ‘make’ utility built for CYGWIN |
m4.exe | Interpreters | m4 | GNU implementation of the traditional Unix macro processor |
cpio.exe | Utils | cpio | A program to manage archives of files |
gawk.exe | Utils | awk | Pattern-directed scanning and processing language |
file.exe | Utils | file | Determines file type using ‘magic’ numbers |
zip.exe | Archive | zip | Package and compress (archive) files |
unzip.exe | Archive | unzip | Extract compressed files in a ZIP archive |
free.exe | System | procps | Display amount of free and used memory in the system |
此处如果选择的服务器不合适的话,尽管你的网络本身速度很快,但是此处下载速度很慢。所以,此处需要选择一个速度比较快的服务器。对于国内来说,连接很多国外的服务器,速度一般都很慢。我是参照网上相关方法自己手动添加:
在Use URL处,输入:http://mirrors.163.com/cygwin/
CYGWIN 安装时的定制包选择界面如图:
默认都是default,选择需要必须要安装的点击那个如刷新的按钮,切换成install;
这里有个困扰人的地方是怎么查找上面提到的相关包,可能有的人直接ALL INSTALL ,我第一次就是这样,网上1M/s下载约8个小时,共20G左右库包,下载完后根据库包安装D盘剩余50多G被占完还无法安装成功,磁盘空间不够!在此极不推荐该方法;
综合网上很多想法,本人推荐方法为:根据包名称查找,比对Description信息,其实查找完后相关包已经不是特别多,直接全install也挺快的,9个必须包不到20来分钟即可全下完。
将CYGWIN的安装路径下bin目录配置到环境变量path中,如我的安装路径为:d:\jvm\cygwin\bin
2.2 安装vs2010
需要该软件的原因:JDK中最核心的代码(Java虚拟机及JDK中Native方法的实现等)是使用C++语言及少量C语言编写的,官方文档中说他们的内部开发环境是Microsoft Visual Studio C++ (VS2003)中进行编译,及Microsoft Visual Studio C++ (VS2010)测试过。
此处省略因为非常简单;(安装路径不要有空格)
2.3 安装FreeType
需要该软件的原因:这是一个免费的字体渲染库,JDK的Swing部分和JConsole这类工具使用到。
将下载的freetype2.7解压。如解压至d:\freetype-2.7,接下来介绍通过vs2010编译64位的freetype-2.7。
编译Freetype
第一次打开vs2010的话,选择使用VC++,选择file-->open-->project/solution...,找到你解压freetype的路径 ,如我的d:\freetype-2.7\builds\windows\vc2010\freetype.sln
打开后,右键项目,选择properties,如图
由于我们想编译64位的openjdk,所以我这里需要64位的,在编译之前的检查中,我们不仅需要dll文件还需要lib文件,都是用同一个工程编译出的只是后缀不太一样。编译两次的时候只需要修改vs2010的配置后缀就OK了,注意在vs2010的配置选中,选择X64的,编译的时候,请右键项目,build,请同学们注意下图:
编译freetype.lib:
编译freetype.dll
两个文件编译完成后,编译的文件在目录:D:\jvm\freetype-2.7\objs\vc2010\x64
然后在d:\freetype-2.7目录下创建lib文件夹,并将编译好的freetype.dll和freetype.lib复制到该目录。
在编译openjdk之前会校验并用到freetype下的include文件夹下的ft2build.h和lib文件夹下的freetype.dll和freetype.lib文件。
然后还需要设置一下freetype的环境变量,FREETYPE_CFLAGS=d:\freetype-2.7\include;FREETYPE_LIBS=d:\freetype-2.7\lib,可以尝试直接设置在path中。如图:
3 编译openjdk
打开cygwin,切换到解压的openjdk_8的文件夹根目录,如:
执行命令
bash ./configure -with-freetype=/cygdrive/d/freetype-2.7 -enable-debug -with-target-bits=64
-with-freetype参数是使用指定的freetype,-enable-debug是编译可调试的openjdk,-with-target-bits=64,是指编译64位的.
再执行上述操作前如果设置了环境变量JAVA_HOME, CLASSPATH 记得删除,否则会报错
编译时遇到问题:
1)如果cygwin安装的是2.X的版本则在编译的过程中会报cygwin的版本太老,这是检测脚本的一个bug,该脚本在common/autoconf目录下使用文本编辑器打开generated-configure.sh搜索Your cygwin is too old,关注7249行原来是1.7这里我根据自己的cygwin版本改成了2.10。
最终编译效果图如下,本人的有点小问题是:ccache status:not available for your system,但影响不大,以后改进
最后可以通过make all命令进行下一步的工作,编译完的结果在D:\jvm\openjdk-8u40\openjdk\build\windows-x86_64-normal-server-fastdebug中。
参考文章:
https://blog.csdn.net/wqlinloveruby/article/details/80409031
https://blog.csdn.net/tangyongzhe/article/details/53576097