Javaが促進される理由は、実際にはクロスプラットフォームであり、その大きな役割が仮想マシンの関係のためであるため、実際には大きな理由です。
一般的に言えば、開発者は毎日開発するために仮想マシンの内部実装に注意を払う必要はありませんが、パフォーマンスに関しては、仮想マシンの実装メカニズムを理解する必要があります。
ですから、今日私が書いたのは、将来的に仮想マシンの基礎となる原則を理解するための道を開くために、独自の仮想マシンのセットを編集することです。
仮想マシンをコンパイルすると、多くの落とし穴が遭遇する可能性があり、時間がかかります。私たちの環境の違いにより、私たちが遭遇する可能性のある問題は一貫性がありません。
私は、私が遭遇したすべての問題を、ちょうどスプラッシュを作るのが好きだと言っているだけです。
1まず、OpenJDKのソースコードをダウンロードする必要があります。このOpenJDKには実際にバージョンの履歴があります。あなたはそれについて学ぶことができます。
次に、ここのソースコードコンテンツのほとんどはOracle JDKコンテンツと同じであり、いくつかのコンテンツは異なります。
ここにダウンロードしたOpenJDKのソースコードは、OpenJDK-7U75-SRC-B13-13-13-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 UNZIP OpenJDK-7U75-SRC-B13-18_DEC_2014.ZIPとOpenJDKフォルダーを取得します。 /usrの下に置きます。
3Execute jdk-6u32-linux-x64.binは、JDK1.6.0_32フォルダーを取得します。このフォルダーを /usr /javaに入れることについて話しましょう。
4 Vim /etc /プロファイルを入力し、最後に次のコンテンツを追加します。
lang = c#bootstrap-jdkのインストールパスをエクスポートし、bootstrap-jdk export alt_bootdir =/usr/java/jdk1.6.0_32#のbootstrap-jdkのパスに置き換えます。読者はそれをOraclejdkexport alt_jdk_import_path =/usr/java/jdk1.6.0_32に直接置き換えることができますbuild_jaxws = false#export build_jaxp = false#export build_corba = falseexport build_hotspot = trueexport build_jdk = truexport skip_compare_images = truebuild_deploy = falsebuild_install = false#false export alt_outputdir =/usr/openjdk/buildjdk lock_downloads = true#2つの環境変数を削除する必要があります。ティー$ alt_outputdir/build.log
構成を更新するには、ソース /など /プロファイルが必要であることに注意してください。しかし、入力後、すぐに実行されますが、まだ成功していません。これはまだ成功していません。 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アドレスは、alt_bootdir =/usr/java/jdk1.6.0_32のエクスポートです。
6次に、 /usr /openjdkディレクトリに移動して、Sanityコマンドを実行し、構成が問題ないかどうかを確認します。問題がない場合は、表示されます
70,000個のものが利用可能です。東風のみが必要です。メーカーを入力してコンパイルを開始します。コンパイルされたものは、/usr/openjdk/buildディレクトリで生成されます。
これがプロセスですが、この期間中にいくつかの問題が発生します。彼が報告したエラーによると、いくつかのエラーを修正する必要があります。修正後、コマンドを作成してからコンパイルします。
ここに私が遭遇したいくつかのエラーとソリューションがあります。
1>
echo "***このOSはサポートされていません:" `uname -a`;終了1;
openJDK/hotspot/make/linux/makefile:240:ターゲットのレシピ 'check_os_version'が失敗しました
解決する:
次の3行のcheck_os_versionのコメント/openjdk/hotspot/make/linux/makefile
check_os_version:
#ifeq($(disable_hotspot_os_version_check)$(empty_if_not_supported)、))
#$(静かに)>&2 echo "***このOSはサポートされていません:" `uname -a`;終了1;
#endif
2>
`void g1satbcardtablemodrefbs :: write_ref_array_pre_work <oopdesc*>(oopdesc **、int)への未定義の参照
解決策:hotspot/src/share/vm/gc_implementation/g1でg1satbcardtablemodrefbs.cppを設定します
テンプレート<クラス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追加void g1satbcardtablemodrefbs :: write_ref_array_pre(ooop* dst、int count、bool dest_uninitialized){if(!dest_uninitialized){write_ref_array_pre_work(dst、count); }} void g1satbcardtablemodrefbs :: write_ref_array_pre(draweoop* dst、int count、bool dest_uninitialized){if(!dest_uninitialized){write_ref_array_pre_work(dst、count); }} // 2017-10-19 vicent_chenが追加されました
G1SATBCARDTABLEMODREFBS.HPPをHotSpot/SRC/Share/VM/GC_Implementation/G1に次のように入れます
仮想void write_ref_array_pre(ooop* dst、int count、bool dest_uninitialized){if(!dest_uninitialized){write_ref_array_pre_work(dst、count); }} virtual void write_ref_array_pre(draweroop* dst、int count、bool dest_uninitialized){if(!dest_uninitialized){write_ref_array_pre_work(dst、count); }}
コメントしてから、仮想void write_ref_array_pre(oop* dst、int count、bool dest_uninitialized)を追加します。仮想void write_ref_array_pre(draweroop* dst、int count、bool dest_unintialized);
3>
エラー:時間は現在から10年以上です: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 Commandを何度か連続して再入力してきました
再び成功します。したがって、この状況に遭遇したとき、何度も再びそれを行うことができます。最後にメモリが急上昇しなかったとき。
編集は次のように成功します:
その後、コンパイルされたJDKをビルドフォルダーに見つけることができます。
みなさん、ありがとうございます。ご質問がある場合は、お問い合わせください。
コンピレーション仮想マシンJVM-Openjdkに基づくコンピレーションの上記の詳細な説明は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。