Причина, по которой Java продвигается, на самом деле является большой причиной, потому что она кроссплатформенная, и ее большая роль связана с отношениями виртуальной машины.
Вообще говоря, разработчикам не нужно обращать внимание на внутреннюю реализацию виртуальных машин для развития ежедневно, но иногда, когда дело доходит до производительности, им необходимо понимать механизм реализации виртуальных машин.
Так что я написал сегодня, так это больше о том, как набор ваших собственных виртуальных машин, чтобы проложить путь для понимания основных принципов виртуальных машин в будущем.
Компиляция виртуальных машин может столкнуться с множеством подводных камней, и это займет время. Из -за различий в нашей среде проблемы, с которыми мы можем столкнуться, противоречивы.
Я могу только сказать, что я перечислил все проблемы, с которыми я столкнулся, просто как сделать всплеск.
1 Прежде всего, мы должны загрузить исходный код OpenJDK. У этого OpenJDK на самом деле есть история версий. Вы можете узнать об этом.
Тогда большая часть содержимого исходного кода здесь такая же, как и контент Oracle JDK, и несколько содержимого отличаются.
Исходной код OpenJDK, который я скачал здесь, openjdk-7u75-src-b13-18_dec_2014.zip. Версия каждого может быть другой, но это исходный код OpenJDK.
2 В дополнение к подготовке вышеуказанных вещей, вам также необходимо подготовить Oracle JDK. Я использую JDK-6U32-Linux-X64.bin для этого JDK.
3 Затем подготовьте различные зависимости от Linux сначала. Эти зависимости будут получены позже. Кроме того, я хочу поговорить о системе Linux здесь.
Это 64-битный 64-битный Ubuntu, поэтому лучше всего подготовить 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 /и т. Д. /Профиль и добавьте следующее контент в конце:
Экспорт LANG = C#Путь установки Bootstrap-JDK, замените его путем Bootstrap-JDK Export alt_bootdir =/usr/java/jdk1.6.0_32#То же, что и выше, я использовал OpenJdk для компиляции, и когда я управлял горячей точкой, я заменил его OracleJDK. Читатели могут напрямую заменить его на oraclejdkexport alt_jdk_import_path =/usr/java/jdk1.6.0_32#Укажите несколько потоков, чтобы выполнить этот скрипт hotspot_build_jobs = 4export alt_parallel_compile_jobs = 4#Содержание. Build_jaxws = false#export build_jaxp = false#export build_corba = falseexport build_hotspot = trueExport build_jdk = trueExport skip_compare_images = truebuild_deploy = falsebuild_install = false#Путь к собранному результату рекомендуется быть STRED в коде Build in optionJDK. Export alt_outputdir =/usr/openjdk/buildexport allow_downloads = true#Две переменные среды необходимо удалить, в противном случае возникнут проблемы Unset java_homeunset classpathmake 2> & 1 | tee $ alt_outputdir/build.log
Обратите внимание, что для обновления конфигурации требуется источник /и т. Д. /Профиль. Но после ввода он будет работать немедленно, но сейчас он не преуспеет, потому что это зависит от тех, которые еще не были сделаны. Нажмите Ctrl+C сразу, чтобы сделать паузу.
5 Выполните некоторые команды в терминале для установки необходимых зависимостей, команды следующие:
sudo apt-get установить строительную 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, является экспортом alt_bootdir =/usr/java/jdk1.6.0_32.
6 Теперь мы перейдем к каталогу /usr /openjdk, чтобы выполнить команду Make Sanity, и проверяем, в порядке ли конфигурация. Если нет проблем, это будет отображаться
70 000 вещей доступны, требуется только восточный ветер, введите Make и Start Compling. Скомпилированные вещи будут генерироваться в каталоге/usr/openjdk/build.
Это процесс, но в этот период возникнут некоторые проблемы. В соответствии с ошибками, сообщенными им, нам нужно исправить некоторые ошибки. После коррекции мы продолжим выполнять команду, а затем компилируются.
Вот некоторые ошибки и решения, с которыми я столкнулся.
1>
Echo "*** Эта ОС не поддерживается:" `uname -a`; Выход 1;
OpenJdk/Hotspot/Make/Linux/Makefile: 240: Рецепт для цели 'check_os_version
решать:
Прокомментируйте следующие три строки чека
check_os_version:
#IfeQ ($ (DISABLE_HOTSPOT_OS_VERSION_CHECK) $ (umpty_if_not_supported),)
# $ (Тихо)> & 2 echo "*** Эта ОС не поддерживается:" `uname -a`; Выход 1;
#endif
2>
неопределенная ссылка на `void g1satbcardtablemodrefbs :: write_ref_array_pre_work <oopdesc*> (oopdesc **, int) '
Решение: Установите G1SATBCARDTABLEMODREFBS.CPP в HOTSPOT/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; 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 visent_chen добавил void g1satbcardtablemodrefbs :: write_ref_array_pre (oop* dst, int count, bool dest_uninitialized) {if (! Dest_uninitialized) {write_ref_pre_work (dst, граф); }} void g1satbcardtablemodrefbs :: write_ref_array_pre (countyoop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} // 2017-10-19 visent_chen добавлен
Поместите g1satbcardtablemodrefbs.hpp в Hotspot/src/share/vm/gc_implementation/g1 следующим образом
virtual void write_ref_array_pre (oop* dst, int count, bool dest_uninitialize) {if (! dest_uninitialize) {write_ref_array_pre_work (dst, count); }} virtual void write_ref_array_pre (countyoop* dst, int count, bool dest_uninitialize) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }}
Прокомментируйте, а затем добавьте виртуальную void write_ref_array_pre (oop* dst, int count, bool dest_uninitialized); Virtual void write_Ref_array_pre (узкий* 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; попробуйте
VE = VEB; 2008-01-01-04-00-00; VEF
4> В будущем, при составлении rmiserverimpl_stub.class вполне вероятно, что память недостаточно, потому что через системный монитор наблюдал, что память резко увеличилась в течение этого периода. Я не знаю конкретной причины, но я вернулся в команду Make несколько раз подряд, до последнего раза
Успех снова. Поэтому, когда вы сталкиваетесь с этой ситуацией, вы можете сделать это снова много раз. В последний раз память не взлетела.
Компиляция успешна следующим образом:
Затем вы можете найти свой скомпилированный JDK в папке сборки.
Спасибо всем, если у вас есть какие -либо вопросы, пожалуйста, спросите меня.
Приведенное выше подробное объяснение компиляции, основанное на виртуальной машине компиляции JVM-Openjdk, является всем контентом, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.