深刻理解Java虛擬機——第一章——走進Java

Java技術體系

JDK(Java Development Kit):Java開發組件,是用於支持Java程序開發的最小環境,包括Java程序設計語言、Java虛擬機、Java API類庫。html

JRE(Java Runtime Environment):支持Java程序運行的標準環境,包括Java虛擬機、Java API類庫中的Java SE API子集。java

Java技術體系能夠分爲4個平臺:linux

  • Java Card:支持一些Java小程序運行在小內存設備(如智能卡)上的平臺
  • Java ME(Micro Edition):支持Java程序運行在移動終端上的平臺,之前稱J2ME
  • Java SE(Standard Edition):支持面向桌面級的應用(如Windows下的應用程序),之前稱J2SE
  • Java EE(Enterprise Edition):支持使用多層架構的企業應用,之前稱J2EE,通常以javax.*做爲包名

JIT(Just In Time)編譯器。git

Java技術的將來:編程

  • 模塊化:避免爲了系統的一小塊功能而去安裝部署龐大的系統
  • 混合語言:愈來愈多基於Java虛擬機開發的語言,可用於多語言混合編程。例如並行處理用Clojure,展現層用Jruby,中間層用Java,每種語言針對本身擅長的方面解決問題。

函數式編程(如lambada)的一個重要優勢是這樣的程序自然地適合並行運行:小程序

函數式編程不須要考慮"死鎖"(deadlock),由於它不修改變量,因此根本不存在"鎖"線程的問題。沒必要擔憂一個線程的數據,被另外一個線程修改。如瀏覽器

var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);
因爲s1和s2互不干擾,不會修改變量,誰先執行是無所謂的,因此能夠放心地增長線程,把它們分配在兩個線程上完成。
(函數式編程的核心就跟數學的函數同樣,每次相同輸入只有惟一的輸出,若是不知足則不是函數式編程,即Op1()每次返回的值都不一樣它就不算函數式編程,若是必需要改變變量,須要把變量copy來修改。典型的就是num++和num+1的區別,後者纔是函數式編程)

編譯OpenJDK8:

OS:CentOS 7 64bit; 
OpenJDK:openjdk-8u40; 
ruby

注意:下面的OpenJDK源碼的編譯過程沒有設置Bootstrap JDK。bash

書上說虛擬機有的代碼是使用Java自身實現的,所以編譯這些Java代碼須要用到一個可用的JDK,即「Bootstrap JDK」,這個JDK須要JDK6以後的版本。Bootstrap JDK須要在編譯前的環境變量設置裏指定路徑,可是我沒有進行設置,也成功編譯了源碼,所以不知道這個Bootstrap JDK是不是必須須要的,我編譯成功多是由於本地已經裝了一個Java,若是沒有在編譯前的環境變量裏設置,會自動把當前系統的環境變量指定的JDK當成Bootstrap JDK。具體Bootstrap JDK是否須要得在一個沒有安裝過Java的系統裏面測試。架構

1. 獲取JDK源碼:

首先安裝mercurial,由於OpenJDK是用mercurial管理的。

sudo yum install mercurial

而後克隆源碼,運行get_source.sh腳本得到全部源代碼。(書上給的能下載到打包好的源碼網址https://jdk7.java.net/source.html,如今只能下載到二進制源碼,而咱們須要的是cpp源碼,在網址裏的Archive裏選擇source下載,也是跳轉到下面給出的hg網址,應該是選擇不給提供打包的源碼了)

注意:不能直接從網址裏面找gz壓縮包下載,而後解壓運行get_source.sh腳本,若是沒下載mercurial會出現錯誤ERROR: Could not locate Mercurial command,由於裏面還要經過mercurial下載其它源代碼,

下載了mercurial再運行也會出現錯誤ERROR: Need initial repository to use this script,必須得用mercurial的hg命令來克隆項目再運行。應該跟git同樣,沒有初始化用戶信息是操做不了項目倉庫裏的某個文件,克隆下來整個項目應該會自動包含項目管理者的用戶信息,所以能夠操做。

 在下載源代碼可能會有abort錯誤,緣由是由於外網的問題,自行解決。

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/
cd jdk8u-dev
sh ./get_source.sh

2. 設置環境變量:

接下去設置環境變量,新建一個sh文件,例如env.sh,填入如下內容,而後sh env.sh執行

# 語言選項
export LANG=C
# 容許自動下載依賴
export ALLOW_DOWNLOADS=true
# 並行編譯的線程數,編譯時間長,爲了避免影響其餘工做,選擇爲1
export HOTSPOT_BUILD_JOBS=1
# 是否跳過與先前版本的比較
export SKIP_COMPARE_IMAGES=true
# 是否使用預編譯頭文件,加快編譯速度
export USE_PRECOMPILED_HEADER=true
# 是否使用增量編譯
export INCREMENTAL_BUILD=true
# 編譯內容
export BUILD_LANGTOOLS=true
export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_CORBA=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
# 編譯版本
export SKIP_DEBUG_BUILD=true
export SKIP_FASTDEBUG_BUILD=false
export DEBUG_NAME=debug
# 避開javaws和瀏覽器Java插件之類的部分的build
export BUILD_DEPLOY=false
export BUILD_INSTALL=false
unset JAVA_HOME

3. 構建編譯環境:

運行OpenJDK源碼目錄下的configure文件

bash ./configure

若是缺乏某個環境,運行configure會提示,按提示的下載便可。

通常須要下載的以下

yum groupinstall "Development Tools" 
yum install libXtst-devel libXt-devel libXrender-devel 
yum install cups-devel 
yum install freetype-devel 
yum install alsa-lib-devel

configure運行成功的結果以下

 

4. 編譯:

 在OpenJDK源碼目錄下運行make all

make all

編譯成功以後顯示以下

5. 測試:

當前目錄下的bulid文件裏有個linux-x86_64-normal-server-release文件夾,就是編譯結果。裏面有許多文件,其中/images/j2sdk-image有和直接安裝OpenJDK後相似Java目錄結構,這就是整個JDK的完整編譯結果。具體查看過程以下

cd ./build/linux-x86_64-normal-server-release/images/j2sdk-image/bin
./java -version
# 獲得
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-xx_2019_07_09_13_56-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)

 

 

以後這個整個j2sdk-image文件夾就能夠被拷貝到任何地方,並配置環境變量使用。

配置變量能夠在用戶主目錄下建立.bash_profile裏文件,內容以下(其中OpenJDK_1.8.0就是上面的j2sdk-image的拷貝)

 

export JAVA_HOME=/usr/用戶名/java/OpenJDK_1.8.0
export CLASSPATH=./:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

 

 

 

以後source .bash_profile使環境變量生效,用java -version查看結果。

相關文章
相關標籤/搜索