深入理解JAVA虚拟机读书笔记----走进JAVA

时间:2023-01-01 23:58:46

1、JAVA虚拟机上的其他语言实例

1.1、Clojure:是一种运行在Java平台上的 Lisp 方言
1.2、JRuby:一个采用纯Java实现的Ruby解释器
1.3、Groovy:Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。
深入理解JAVA虚拟机读书笔记----走进JAVA

2、JAVA技术体系图

深入理解JAVA虚拟机读书笔记----走进JAVA
从上到下依次是:JAVA语言、工具&工具API、程序部署发布、用户界面工具包、集成库、其他基础库、语言和工具基础库、java虚拟机(JVM)

3、JAVA语言前身:

Oak(橡树)

4、JAVA虚拟机:

Classic VM、Exact VM、HotSpot VM。

Classic VM(sun开发的第一代商用的JVM)、Exact VM(sun公司对第一代有改进,时间短,因为优秀的HotSpot VM出来了)
HotSpot VM继承了他们的优点。在JDK1.3设为默认虚拟机,JDK1.7,1.8仍然是默认虚拟机
BEA JRockit VM也是另一款优秀的虚拟机

5、OSGI(Open Service Gateway Initiative)

OSGi服务平台向Java提供服务,这些服务使Java成为软件集成和软件开发的首选环境。Java提供在多个平台支持产品的可移植性。OSGi技术提供允许应用程序使用精炼、可重用和可协作的组件构建的标准化原语,这些组件能够组装进一个应用和部署中。

6、JAVA技术未来发展

模块化:OSGI提供基础
混合语言:多语言协同工作或许是主流,或许
多核并行:多核计算机的支持
进一步丰富的语法:java5扩充了挺多,JAVA7、8都会扩充
64位虚拟机:以前存在性能问题,现在解决了

7、自己编译jdk

这个是自己以前编译的过程,此处转过来:
http://stepbystep.top/2016/09/09/linux%E4%B8%8B%E7%BC%96%E8%AF%91%E8%87%AA%E5%B7%B1%E7%9A%84JDK7/


下载OpenJDK源码

下载地址,请下载Source Code(源代码)
解压到自己的要存放的目录中

构建编译环境

所有文件的保存路径等最好不要有中文,以免造成不必要的麻烦。

编译环境需要 Bootstarp JDK 和 GCC。Bootstrap JDK 就是需要一个可用的JDK版本,在下面命令中我下载了openjdk-6的版本,如果已经有了JDK,就可以不下载了。

#下载GCC相关的编译环境
$ sudo apt-get install build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant libxt-dev libxtst-dev
#下载openjdk6
$ sudo apt-get openjdk-6-jdk

进行编译

terminal中进行环境变量设置:

#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C

#Bootstrap JDK的安装路径。必须设置。请改成自己的Bootstrap JDK路径
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-i386/

#允许自动下载依赖
export ALLOW_DOWNLOADS=true

#并行编译的线程数,设置为和CPU内核数量一致即可。请设置成自己的CPU内核数
export HOTSPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_JOBS=2

#比较本次build出来的映像与先前版本的差异。这个对我们来说没有意义,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像。如果有设置dev或者DEV_ONLY=true的话这个不显式设置也行。
export SKIP_COMPARE_IMAGES=true

#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true

#要编译的内容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true

#要编译的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug

#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build。
BUILD_DEPLOY=false

#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。
BUILD_INSTALL=false

#编译结果所存放的路径。请设置好自己的编译结果存放路径
export ALT_OUTPUTDIR=/home/leo/java/myjdk

#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)
unset JAVA_HOME
unset CLASSPATH

$ make sanity      #编译检查,最后输出“Sanity check passed”即检查通过
#此处提醒!!可以先看看避坑总结,然后再编译,可以避免一些错误
$ make DEBUG_BINARIES=true 2>&1 | tee build.log

避坑总结

问题一:cc1plus: error: the “stabs” debug format cannot be used with pre-compiled headers [-Werror=deprecated]
问题解决:因为高版本的gcc不再支持stabs,解决办法:在make命令中加上 DEBUG_BINARIES=true

问题二:遇到错误Error:./gamma: relocation error: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
问题解决:修改文件hotspot/make/linux/Makefile,删掉文件中所有的 && ./test_gamma ,我的文件一共出现6次

问题三:Error: time is more than 10 years from present: 1136059200000
问题解决:将jdk源码下的jdk/src/share/classes/java/util/CurrencyData.properties里面出现的时间全部改为10年内的时间。
例如:TR=TRL;2004-12-31-22-00-00;TRY 改为 TR=TRL;2014-12-31-22-00-00;TRY

编译成功

出现如下字样,表示就编译成功了。

#– Build times ———-
Target all_product_build
Start 2016-09-09 09:46:45
End 2016-09-09 09:56:22
00:00:03 corba
00:00:10 hotspot
00:00:02 jaxp
00:00:03 jaxws
00:09:17 jdk
00:00:02 langtools
00:09:37 TOTAL
————————-

此时,进入编译结果存放目录,进入 j2sdk-image 目录,这就是一个完整的JDK编译结果了。
输入命令:

$ ./java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-leo_2016_09_09_09_32-b00)
OpenJDK Server VM (build 24.0-b56, mixed mode)

很爽吧,里面还带有自己的机器名(leo),还有编译时间。此时,拿着这个jdk就可以全局使用了:

$ sudo gedit ~/.bashrc
# 尾部加上
export JAVA_HOME=/home/leo/java/myjdk/j2sdk-image
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

$ source ~/.bashrc
$ java -version #可以到处使用了

最后,提醒一下,OpenJDK可能有很多内容并不时候生产环境使用,生产环境最好还是使用Oracle JDK或者Sun JDK。