إن السبب وراء ترقية Java هو في الواقع سبب كبير لأنه متشابك ، ودوره الكبير يرجع إلى علاقة الجهاز الظاهري.
بشكل عام ، لا يحتاج المطورون إلى الانتباه إلى التنفيذ الداخلي للأجهزة الافتراضية للتطوير يوميًا ، ولكن في بعض الأحيان عندما يتعلق الأمر بالأداء ، يحتاجون إلى فهم آلية التنفيذ للأجهزة الافتراضية.
لذا فإن ما كتبته اليوم هو المزيد حول تجميع مجموعة من أجهزتك الافتراضية لتمهيد الطريق لفهم المبادئ الأساسية للآلات الافتراضية في المستقبل.
قد يواجه تجميع الأجهزة الافتراضية العديد من المزالق وسيستغرق وقتًا. نظرًا للاختلافات في بيئتنا ، فإن المشكلات التي قد نواجهها غير متسقة.
لا يسعني إلا أن أقول إنني أدرجت جميع المشكلات التي واجهتها ، تمامًا مثل صنع دفقة.
1 أولاً وقبل كل شيء ، يجب علينا تنزيل الكود المصدري لـ OpenJDK. هذا OpenJdk لديه بالفعل تاريخ الإصدار. يمكنك التعرف على ذلك.
ثم معظم محتوى التعليمات البرمجية المصدر هنا هو نفس محتوى Oracle JDK ، وبعض المحتويات مختلفة.
الكود المصدري لـ OpenJdk I Downloading هنا هو OpenJDK-7U75-SRC-B13-18_DEC_2014.zip. قد يكون إصدار الجميع مختلفًا ، ولكنه رمز OpenJDK المصدر.
2 بالإضافة إلى إعداد الأشياء المذكورة أعلاه ، تحتاج أيضًا إلى إعداد Oracle JDK. يمكنني استخدام JDK-6U32-Linux-X64.bin لهذا JDK.
3 ثم إعداد تبعيات مختلفة على Linux أولاً. سيتم الحصول على هذه التبعيات لاحقًا. بالإضافة إلى ذلك ، أريد أن أتحدث عن نظام Linux هنا.
إنه Ubuntu 16.04lts 64 بت ، لذلك من الأفضل إعداد 64 بت للأشياء السابقة.
كل شيء جاهز ، الآن سنبدأ العمل! ! ! !
1 إذا قمت بتعيين متغير بيئة Java_home أو ClassPath من قبل ، يرجى التعليق أولاً.
2 unsip 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 /profile وأضف المحتوى التالي في النهاية:
تصدير lang = c#pootstrap-jdk مسار التثبيت ، استبدله بمسار bootstrap-jdk alt_bootdir =/usr/java/jdk1.6.0_32#كما هو مذكور أعلاه ، لقد استخدمت Openjdk للترجمة ، وعندما ركضت Hotspot ، استبدلت oraclejdk. يمكن للقراء استبداله مباشرة بـ OraclejDkexport als_jdk_import_path =/usr/java/jdk1.6.0_32#حدد العديد من مؤشرات الترابط لتنفيذ هذا البرنامج النصي Hotspot_Build_Jobs = 4export alpariled_compile_jobs = 4#المحتوى المترجم ، يمكن للمقالبين اختيار to to to acport. build_jaxws = false#التصدير build_jaxp = false#التصدير build_corba = falseexport build_hotspot = true export build_jdk = truexport skip_compare_images = trueBuild_deploy = falsebuild_install = false#تم التوصية بالمسار المسبق للنتيجة المترجمة في Build in the OpenJdK. التصدير alt_outputdir =/usr/openjdk/buildexport allow_downloads = true#يجب إزالة متغيرات البيئة ، وإلا فإن هناك مشاكل java_homeunset classpathmake 2> & 1 | tee $ alt_outputdir/build.log
لاحظ أن هذا المصدر /الخ /الملف الشخصي مطلوب لتحديث التكوين. ولكن بعد الإدخال ، سيتم تشغيله على الفور ، لكنه لن ينجح الآن لأنه يعتمد على تلك التي لم يتم القيام بها بعد. اضغط على Ctrl+C على الفور للتوقف.
5 تنفيذ بعض الأوامر في المحطة لتثبيت التبعيات اللازمة ، الأوامر هي كما يلي:
sudo app-get install build-lessed 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. هذا هو السبب في أن عنوان JDK يشير إليه في برنامج Build.sh هو تصدير albootdir =/usr/java/jdk1.6.0_32.
6 الآن نذهب إلى دليل /usr /openjdk لتنفيذ أمر Make Sanity ، وتحقق مما إذا كان التكوين على ما يرام. إذا لم تكن هناك مشكلة ، فسيتم عرضها
70،000 شيء متاح ، لا يلزم سوى الرياح الشرقية ، أدخل Make وابدأ التجميع. سيتم إنشاء الأشياء المترجمة في دليل/usr/openjdk/build.
هذه هي العملية ، ولكن ستحدث بعض المشكلات خلال هذه الفترة. وفقًا للأخطاء التي أبلغ عنها ، نحتاج إلى تصحيح بعض الأخطاء. بعد التصحيح ، سوف نستمر في جعل الأمر ثم جمع.
فيما يلي بعض الأخطاء والحلول التي واجهتها.
1>
صدى "*** هذا نظام التشغيل غير مدعوم:" `uname -a` ؛ الخروج 1 ؛
OpenJDK/Hotspot/Make/Linux/Makefile: 240: وصفة للهدف "Check_os_version" فشل
يحل:
التعليق على الأسطر الثلاثة التالية من check_os_version في/openjdk/hotspot/make/linux/makefile
check_os_version:
#ifeq ($ (disable_hotspot_os_version_check) $ (فارغ_
# $ (بهدوء)> & 2 echo "*** هذا نظام التشغيل غير مدعوم:" `uname -a` ؛ الخروج 1 ؛
#endif
2>
إشارة غير محددة إلى "void g1satbcardtablemodrefbs :: write_ref_array_pre_work <Oopdesc*> (Oopdesc ** ، int) ''
الحل: تعيين G1SatbCardTableModrefbs.cpp في نقطة ساخنة/src/share/vm/gc_implementation/g1
قالب <فئة 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 ؛ لـ (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 (OOP* dSt ، int count ، bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst ، count) ؛ }}} void g1satbcardtablemodrefbs :: write_ref_array_pre (rearrowoop* dst ، int ، bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst ، count) ؛ }} // 2017-10-19 Vicent_chen أضيفت
ضع g1satbcardtablemodrefbs.hpp في نقطة ساخنة/src/share/vm/gc_implementation/g1 على النحو التالي
void الافتراضية write_ref_array_pre (OOP* dst ، int ، bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst ، count) ؛ }} Virtual void write_ref_array_pre (rearrowoop* dst ، int count ، bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst ، count) ؛ }}
التعليق خارج ، ثم أضف void destrual write_ref_array_pre (OOP* dst ، int count ، bool dest_uninitialized) ؛ void الافتراضي write_ref_array_pre (rearrowoop* 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 ؛ رون
TR = TRL ؛ 2004-12-31-22-00-00 ؛ حاول
VE = VEB ؛ 2008-01-01-04-00-00 ؛ VEF
4> في المستقبل ، عند تجميع rmiserverimpl_stub.class ، من المحتمل أن تكون الذاكرة غير كافية ، لأنني لاحظت من خلال مراقبة النظام أن الذاكرة قد زادت بشكل حاد خلال هذه الفترة. لا أعرف السبب المحدد ، لكنني أعيد إدخال الأمر Make عدة مرات على التوالي ، حتى آخر مرة
النجاح مرة أخرى. لذلك عندما تواجه هذا الموقف ، يمكنك القيام بذلك مرة أخرى عدة مرات. آخر مرة لم ترتفع الذاكرة.
التجميع ناجح على النحو التالي:
ثم يمكنك العثور على JDK المترجمة في مجلد Build.
شكرا لكم الجميع ، إذا كان لديك أي أسئلة ، يرجى طرحها.
التفسير التفصيلي أعلاه للتجميع بناءً على الجهاز الظاهري للتجميع JVM-OpenJDK هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.