引言
Java程序员应该都听过HotSpot JVM,它是Sun JDK和Open JDK中所带的虚拟机,也是目前使用范围最广的虚拟机. 不过很多人不知道的是,这个目前“血统纯正”的虚拟机最初并非由Sun公司开发,而是由一家名为”Longview Technologies”的小公司设计的;甚至这个虚拟机最初并非是为Java语言开发的,它来源于Strongtalk VM,而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现”达到C语言50%以上的执行效率”的目标而设计的虚拟机,Sun公司注意到了这款虚拟机在JIM编译上有许多优秀的理念和实际效果,在1997年收购了Longview Technologies公司,从而获得了HotSpot VM.
HotSpot VM继承了Sun之前的两款商用VM的优点,同时也有直接的一些优势,如它名称中的HotSpot指的是它的热点代码探测技术.
为了更好地分析这款目前使用最广的Java虚拟机,首先需要将虚拟机源码进行编译。这里选择jdk7进行分析是基于以下原因:
hotspot源代码包含在openjdk7中
openjdk7包含了jdk的Java代码,所以要用jdk6对这部分代码进行编译。(有点类似于gcc高版本代码要用gcc低版本编译一样)
1.安装依赖项
安装如下依赖即可:
|
|
2.openjdk6安装
由于jdk7的很多feature使用java完成,所以它需要一个老版本的jdk来编译它自己,很多的书或者博客会说安装openjdk6就可以,但实际上由于openjdk的一个bug,导致使用openjdk6会出现以下错误:
|
|
真正要安装的是Oracel JDK6,我自己安装的是Oracel JDK 1.6.0_45-b06这个版本.至于如何安装Oracle JDK这样简单的问题就不说了,不知道的童鞋可以看看这个:
安装JDK步骤
3.下载openjdk7源码
最开始我是下载Oracle官网上最新的Openjdk源码,但是发现始终编译不过,从出错信息也查不到原因,所以后面使用了另外一个版本的源码(openjdk-7u6-fcs-src-b24-28_aug_2012),可以在这个链接下载:
openjdk7u6
4.编译脚本
在编译前,需要设置一些条件,由于条件非常多,最好将其写成脚本,如下是我的编译脚本:
|
|
编写好之后运行一下,然后输入以下命令检查:
|
|
如果检查无误的话会出现如下画面:
之后可以简单的输入make,也可以使用以下命令以保存log:
|
|
5.编译中遇到的问题
一定会遇到的error如下:
|
|
从出错消息也能判断,这个是由于时间超过10年导致的,这个问题很好解决:通过修改openjdk/jdk/src/share/classes/java/util/CurrencyData.properties文件, 把10年之前的时间修改为10年之内即可(把所有的时间格式的时间改为2015以前的十年以内的年数)。下面是我修改后的文件:
|
|
5.编译结果
编译成功后会看到以下消息:
至于虚拟机的特性和源码分析等,会在后面的博客陆续进行讲解,敬请期待!