国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于編譯虛擬機jvm—openjdk的編譯詳解

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

2021-02-25 22:54阿寶天天見 Java教程

下面小編就為大家分享一篇基于編譯虛擬機jvm—openjdk的編譯詳解,具有很好的參考價值,希望對大家有所幫助

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

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

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

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

我只能說把自己遇到的問題都列出來,權當拋磚引玉了。

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

然后這里面的源碼內容和oracle jdk內容大部分都是一致的,少數內容不一樣。

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

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

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

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

東西都準備好了,現在我們開干!!!!

1如果之前你設置了java_home或者classpath環境變量,請先注釋掉。

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

3執行jdk-6u32-linux-x64.bin,得到jdk1.6.0_32文件夾,我們講這個文件夾放到/usr/java下。

4輸入vim /etc/profile,在最后加入如下內容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
export lang=c
 
#bootstrap-jdk的安裝路徑,替換為自己bootstrap-jdk的路徑
 
export alt_bootdir=/usr/java/jdk1.6.0_32
 
#同上,我之前使用的是openjdk編譯的,后面運行hotspot時出現問題替換為oraclejdk,讀者可以直接替換為oraclejdk
 
export alt_jdk_import_path=/usr/java/jdk1.6.0_32
 
#規定幾個線程來執行這個腳本
export hotspot_build_jobs=4
export alt_parallel_compile_jobs=4
 
#要編譯的內容,讀者可以根據需要自行選擇
 
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
 
#編譯結果存放的路徑,建議存放在openjdk源碼中build文件夾
 
export alt_outputdir=/usr/openjdk/build
 
export allow_downloads=true
 
#這兩個環境變量需要去掉,不然會出問題
 
unset java_home
 
unset classpath
 
make 2>&1 | tee $alt_outputdir/build.log

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

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

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現在我們到/usr/openjdk目錄去執行make sanity命令,檢查是否配置都沒問題了。如果沒有問題就會顯示

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

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

流程就是這樣的,不過期間會出現一些問題,根據他報的錯我們要修正一些錯誤,修正之后再繼續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)); } } }內容下加上如下

//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年以內

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的時候,很可能是內存不夠了,因為我通過系統監視器觀察得到這段時間內內存在暴增,具體原因也不知道,但是我連續幾次在make命令重新來的時候,到最后一次

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

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

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

之后在build文件夾內就能找到你編譯好的jdk。

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

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

原文鏈接:http://www.cnblogs.com/abaoge/archive/2017/11/30/7932612.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久免费国产精品 | 91免费小视频 | 国产精品日韩欧美一区二区三区 | 免费看黄色一级 | 亚洲精品三级 | 国产一区二区av | 亚洲激情网站 | 欧美人成在线视频 | 日日摸夜夜添夜夜添精品视频 | 国产精品第一国产精品 | 国产一区二区三区在线 | 免费成人福利视频 | 日韩国产精品一区二区 | 中文在线视频 | 国产精品一区二区久久 | 在线观看免费成人av | 国产精品久久久久久久久软件 | 在线看的毛片 | 久久精品无码一区二区日韩av | 亚洲国产91| 簧片av| 亚洲欧美日韩在线 | 欧美精品乱码久久久久久按摩 | 蜜桃臀一区二区三区 | 日韩一级免费观看 | 五月婷婷狠狠爱 | 午夜看片网站 | 中文字幕亚洲欧美 | 免费观看av毛片 | 日韩三级网址 | 91精品久久久久久久久久 | 色综合888| 欧美在线观看一区 | 日韩黄网| 免费污视频在线 | 国产一区二区三区免费 | 成人免费看 | 色综合天天综合网国产成人网 | 天天干人人 | 午夜电影一区 | 亚洲自拍偷拍精品视频 |