最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于編譯虛擬機jvm—openjdk的編譯詳解

 更新時間:2017年12月01日 09:21:25   作者:阿寶天天見  
下面小編就為大家分享一篇基于編譯虛擬機jvm—openjdk的編譯詳解,具有很好的參考價值,希望對大家有所幫助

java只所以被推廣,實際上很大原因是因為本身是跨平臺的,很大作用是因為虛擬機的關(guān)系。

一般情況下開發(fā)人員不需要關(guān)注虛擬機內(nèi)部實現(xiàn)就可以日常開發(fā)了,但是有時候涉及到性能的時候就需要了解虛擬機的實現(xiàn)機制了。

那么今天寫的內(nèi)容更多的是關(guān)于編譯一套自己的虛擬機,為日后了解虛擬機底層原理鋪鋪路。

編譯虛擬機可能會遇到很多坑,也很花費時間。也因大家的環(huán)境的差異,可能遇到的問題都不一致。

我只能說把自己遇到的問題都列出來,權(quán)當(dāng)拋磚引玉了。

1首先我們應(yīng)該下載openjdk的源碼,這個openjdk實際上是有一個版本歷史的,大家可以去了解一下,

然后這里面的源碼內(nèi)容和oracle jdk內(nèi)容大部分都是一致的,少數(shù)內(nèi)容不一樣。

我這里下載的openjdk 源碼是openjdk-7u75-src-b13-18_dec_2014.zip,每個人的版本可能不太一樣,不過 是openjdk的源碼就行。

2除了上面的東西要準備,其實還要準備一個oracle的jdk,這個jdk我用的是jdk-6u32-linux-x64.bin。

3然后是在linux上先準備好各種依賴,這些依賴獲得方式待會兒會講,另外要講的是,我這里的linux系統(tǒng)

是ubuntu的 16.04LTS 64位的,所以之前的東西也最好都準備64位的。

東西都準備好了,現(xiàn)在我們開干?。。?!

1如果之前你設(shè)置了java_home或者classpath環(huán)境變量,請先注釋掉。

2將openjdk-7u75-src-b13-18_dec_2014.zip解壓后得到openjdk文件夾,我們把他放到/usr下。

3執(zhí)行jdk-6u32-linux-x64.bin,得到j(luò)dk1.6.0_32文件夾,我們講這個文件夾放到/usr/java下。

4輸入vim /etc/profile,在最后加入如下內(nèi)容:

export LANG=C

#BootStrap-JDK的安裝路徑,替換為自己bootstrap-JDK的路徑

export ALT_BOOTDIR=/usr/java/jdk1.6.0_32

#同上,我之前使用的是openjdk編譯的,后面運行hotspot時出現(xiàn)問題替換為oracleJDK,讀者可以直接替換為OracleJDK

export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_32

#規(guī)定幾個線程來執(zhí)行這個腳本
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4

#要編譯的內(nèi)容,讀者可以根據(jù)需要自行選擇

export BUILD_LANGTOOLS=true

#export BUILD_JAXWS=false

#export BUILD_JAXP=false

#export BUILD_CORBA=false

export BUILD_HOTSPOT=true

export BUILD_JDK=true

export SKIP_COMPARE_IMAGES=true

BUILD_DEPLOY=false

BUILD_INSTALL=false

#編譯結(jié)果存放的路徑,建議存放在openjdk源碼中build文件夾

export ALT_OUTPUTDIR=/usr/openjdk/build

export ALLOW_DOWNLOADS=true

#這兩個環(huán)境變量需要去掉,不然會出問題

unset JAVA_HOME

unset CLASSPATH

make 2>&1 | tee $ALT_OUTPUTDIR/build.log

注意的是需要source /etc/profile,以更新配置。但是輸入后會馬上跑起來,但是現(xiàn)在是不會成功的,因為依賴那些還沒弄好。直接馬上接著按ctrl+c以暫停。

5在終端執(zhí)行一些命令以安裝必要的依賴,命令如下:

sudo apt-get install build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common ant

有些地方還安裝了openjdk-6-jdk,其實這里不安裝這個更好,我們用的是oracle的jdk來編譯我們的openjdk源碼,不建議用openjdk-6-jdk來編譯openjdk源碼,那也正是我build.sh腳本里面指向的jdk地址是export ALT_BOOTDIR=/usr/java/jdk1.6.0_32的原因。

6現(xiàn)在我們到/usr/openjdk目錄去執(zhí)行make sanity命令,檢查是否配置都沒問題了。如果沒有問題就會顯示

7萬事具備,只欠東風(fēng),輸入make,開始編譯,編譯出的東西會生成在/usr/openjdk/build目錄。

流程就是這樣的,不過期間會出現(xiàn)一些問題,根據(jù)他報的錯我們要修正一些錯誤,修正之后再繼續(xù)make命令接著編譯。

下面是我遇到的一些錯誤和解決辦法。

1>

echo "*** This OS is not supported:" `uname -a`; exit 1;

openjdk/hotspot/make/linux/Makefile:240: recipe for target 'check_os_version' failed

解決:

將/openjdk/hotspot/make/linux/Makefile中的check_os_version下面三行注釋掉

check_os_version:
#ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
# $(QUIETLY) >&2 echo "*** This OS is not supported:" `uname -a`; exit 1;
#endif

2>

undefined reference to `void G1SATBCardTableModRefBS::write_ref_array_pre_work<oopDesc*>(oopDesc**, int)'

解決:將hotspot/src/share/vm/gc_implementation/g1里的g1SATBCardTableModRefBS.cpp

template <class T> void G1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) { if (!JavaThread::satb_mark_queue_set().is_active()) return; T* elem_ptr = dst; for (int i = 0; i < count; i++, elem_ptr++) { T heap_oop = oopDesc::load_heap_oop(elem_ptr); if (!oopDesc::is_null(heap_oop)) { enqueue(oopDesc::decode_heap_oop_not_null(heap_oop)); } } }內(nèi)容下加上如下

//2017-10-19 Vicent_Chen added void G1SATBCardTableModRefBS::write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } void G1SATBCardTableModRefBS::write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } //2017-10-19 Vicent_Chen added

將hotspot/src/share/vm/gc_implementation/g1里的g1SATBCardTableModRefBS.hpp如下部分

virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } }

注釋掉,然后在加入virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized); virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_unintialized);

3>

Error: time is more than 10 years from present: 1136059200000

解決:

openjdk/jdk/src/share/classes/java/util/CurrencyData.properties文件中以下時間改成10年以內(nèi)

AZ=AZM;2005-12-31-20-00-00;AZN

MZ=MZM;2006-06-30-22-00-00;MZN
RO=ROL;2005-06-30-21-00-00;RON

TR=TRL;2004-12-31-22-00-00;TRY

VE=VEB;2008-01-01-04-00-00;VEF

4>之后可能在編譯RMIServerImpl_Stub.class的時候,很可能是內(nèi)存不夠了,因為我通過系統(tǒng)監(jiān)視器觀察得到這段時間內(nèi)內(nèi)存在暴增,具體原因也不知道,但是我連續(xù)幾次在make命令重新來的時候,到最后一次

又成功了。所以遇到這種情況這種情況可以多次重來。最后一次內(nèi)存就沒有暴增了。

編譯成功就是如下的樣子了:

之后在build文件夾內(nèi)就能找到你編譯好的jdk。

謝謝大家,有什么不明了的可以向我提問。

以上這篇基于編譯虛擬機jvm—openjdk的編譯詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot安全策略開發(fā)之集成數(shù)據(jù)傳輸加密

    SpringBoot安全策略開發(fā)之集成數(shù)據(jù)傳輸加密

    這篇文章主要介紹了SpringBoot集成數(shù)據(jù)傳輸加密,近期在對開發(fā)框架安全策略方面進行升級優(yōu)化,提供一些通用場景的解決方案,本文針對前后端數(shù)據(jù)傳輸加密進行簡單的分享
    2023-01-01
  • Spring如何重寫內(nèi)置Bean(Controller、Service等)

    Spring如何重寫內(nèi)置Bean(Controller、Service等)

    本文介紹了在Spring Boot工程中處理外部JAR包中Controller方法重寫的需求,通過PostProcessor方式和自定義注解@ExcludeBean兩種方法,解決了在不修改源代碼的情況下重寫接口的問題
    2025-01-01
  • Java實現(xiàn)多個文檔合并

    Java實現(xiàn)多個文檔合并

    這篇文章主要為大家詳細介紹了如何使用?Java?實現(xiàn)一個簡單且通用的文檔合并工具,主要針對文本文件的合并,感興趣的小伙伴可以參考一下
    2025-03-03
  • java使用poi生成excel的步驟

    java使用poi生成excel的步驟

    2010以上格式使用XSSFWorkBook對象, 2003格式使用HSSFWorkBook對象, 其他對象操作基本一樣,本文重點給大家介紹java使用poi生成excel的相關(guān)知識,感興趣的朋友一起看看吧
    2022-04-04
  • Postman form-data、x-www-form-urlencoded的區(qū)別及說明

    Postman form-data、x-www-form-urlencoded的區(qū)別及說明

    這篇文章主要介紹了Postman form-data、x-www-form-urlencoded的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 通過實例了解cookie機制特性及使用方法

    通過實例了解cookie機制特性及使用方法

    這篇文章主要介紹了通過實例了解cookie機制特性及使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Java報錯java.awt.AWTException: AWT的解決方法

    Java報錯java.awt.AWTException: AWT的解決方法

    在Java圖形用戶界面(GUI)編程中,java.awt.AWTException是一個常見的異常,它通常與AWT(Abstract Window Toolkit)組件相關(guān),這個異常可能在嘗試進行與窗口、圖形環(huán)境或系統(tǒng)剪貼板等操作時拋出,本文將詳細探討AWTException的成因,并提供多種解決方案
    2024-12-12
  • spring boot 添加admin監(jiān)控的方法

    spring boot 添加admin監(jiān)控的方法

    這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能

    基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能

    本文呢主要介紹了基于SpringMVC攔截器實現(xiàn)的接口耗時監(jiān)控功能,統(tǒng)計接口的耗時情況屬于一個可以復(fù)用的功能點,因此這里直接使用 SpringMVC的HandlerInterceptor攔截器來實現(xiàn),需要的朋友可以參考下
    2024-02-02
  • Java日常練習(xí)題,每天進步一點點(34)

    Java日常練習(xí)題,每天進步一點點(34)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07

最新評論

阳高县| 射洪县| 海淀区| 扬州市| 广灵县| 静海县| 三亚市| 汉中市| 成都市| 桑植县| 龙游县| 铁岭市| 裕民县| 金堂县| 沙洋县| 灵石县| 雷山县| 资阳市| 射阳县| 革吉县| 陆河县| 白山市| 宁南县| 娄烦县| 始兴县| 翁牛特旗| 玉田县| 五指山市| 武清区| 驻马店市| 海门市| 长寿区| 洪洞县| 太康县| 精河县| 诸城市| 绥德县| 阜平县| 土默特左旗| 佛坪县| 托里县|