La razón por la cual se promueve Java es en realidad una gran razón porque es multiplataforma, y su gran papel se debe a la relación de la máquina virtual.
En términos generales, los desarrolladores no necesitan prestar atención a la implementación interna de máquinas virtuales para desarrollarse diariamente, pero a veces cuando se trata de rendimiento, deben comprender el mecanismo de implementación de las máquinas virtuales.
Entonces, lo que escribí hoy es más sobre compilar un conjunto de sus propias máquinas virtuales para allanar el camino para comprender los principios subyacentes de las máquinas virtuales en el futuro.
Compilar máquinas virtuales puede encontrar muchas dificultades y llevará tiempo. Debido a las diferencias en nuestro entorno, los problemas que podemos encontrar son inconsistentes.
Solo puedo decir que he enumerado todos los problemas que he encontrado, solo como hacer un chapoteo.
1 En primer lugar, debemos descargar el código fuente de OpenJDK. Este OpenJDK en realidad tiene un historial de versiones. Puedes aprender sobre eso.
Luego, la mayor parte del contenido del código fuente aquí es lo mismo que el contenido de Oracle JDK, y algunos contenidos son diferentes.
El código fuente de OpenJDK que descargué aquí es OpenJDK-7U75-SRC-B13-18_DEC_2014.zip. La versión de todos puede ser diferente, pero es el código fuente de OpenJDK.
2 Además de preparar las cosas anteriores, también debe preparar un Oracle JDK. Uso JDK-6U32-Linux-X64.Bin para este JDK.
3 Luego prepare varias dependencias en Linux primero. Estas dependencias se obtendrán más adelante. Además, quiero hablar sobre el sistema Linux aquí.
Son los 16.04lts de Ubuntu de 64 bits, por lo que es mejor preparar 64 bits para las cosas anteriores.
Todo está listo, ¡ahora comenzaremos a trabajar! ! ! !
Si establece la variable de entorno Java_Home o ClassPath antes, por favor comente primero.
2 Unzip OpenJDK-7U75-SRC-B13-18_DEC_2014.ZIP y obtenga la carpeta OpenJDK. Lo ponemos debajo /usr.
3ExCute JDK-6U32-Linux-X64.Bin para obtener la carpeta JDK1.6.0_32. Hablemos de poner esta carpeta en /usr /java.
4 Ingrese vim /etc /perfil y agregue el siguiente contenido al final:
Exportar lang = C#Bootstrap-JDK Ruta de instalación, reemplácela con la ruta de bootstrap-jdk exportar alt_bootdir =/usr/java/jdk1.6.0_32#igual que el anterior, utilicé OpenJDK para compilar, y cuando ejecuté Hotspot, lo reemplacé con Oraclejdk. Los lectores pueden reemplazarlo directamente con OracleJDKExport alt_jdk_import_path =/usr/java/jdk1.6.0_32#Especifique varios hilos para ejecutar este script exportar hotspot_build_jobs = 4Export alt_parallel_compile_jobs = 4#El contenido que se puede compilar, los lectores pueden optar por exportar build_langtlegt 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#El camino al resultado compilado se recomienda que se almacene en el folicador de compilación en el código de OpenJDK. Exportar alt_outputdir =/usr/openjdk/buildExport tampion_downloads = true#Las dos variables de entorno deben eliminarse, de lo contrario habrá problemas no establecidos java_homeunset classpathmake 2> & 1 | Tee $ alt_outputdir/build.log
Tenga en cuenta que se requiere Fuente /Etc /Perfil para actualizar la configuración. Pero después de la entrada, se ejecutará de inmediato, pero no tendrá éxito ahora porque depende de aquellos que aún no se han hecho. Presione Ctrl+C inmediatamente para hacer una pausa.
5 Ejecutar algunos comandos en el terminal para instalar las dependencias necesarias, los comandos son los siguientes:
sudo apt-get Instale Build-Esenential Gawk M4 LibASound2-Dev libcups2-Dev libxrender-dev xorg-dev xutils-dev x11protoproto-imprint-dev binutils libmotif-common-common horma
Algunos lugares también tienen instalado OpenJDK-6-JDK. De hecho, es mejor no instalar esto aquí. Usamos Oracle JDK para compilar nuestro código fuente OpenJDK. No se recomienda utilizar OpenJDK-6-JDK para compilar el código fuente de OpenJDK. Es por eso que la dirección JDK apuntó en mi script Build.sh es exportar alt_bootdir =/usr/java/jdk1.6.0_32.
6 Ahora vamos al directorio /usr /openjdk para ejecutar el comando Make SILITY, y verifique si la configuración está bien. Si no hay problema, se mostrará
Hay 70,000 cosas disponibles, solo se necesita el viento del este, entrar y comenzar a compilar. Las cosas compiladas se generarán en el directorio/usr/openjdk/build.
Este es el proceso, pero algunos problemas ocurrirán durante este período. Según los errores reportados por él, necesitamos corregir algunos errores. Después de la corrección, continuaremos haciendo el comando y luego compilaremos.
Aquí hay algunos errores y soluciones que encontré.
1>
echo "*** Este sistema operativo no es compatible:" `Uname -a`; salida 1;
Openjdk/hotspot/make/linux/makefile: 240: receta para el objetivo 'check_OS_Version' fallado
resolver:
Comente las siguientes tres líneas de check_os_version in/openjdk/hotspot/make/linux/makefile
check_os_version:
#ifeq ($ (disable_hotspot_os_version_check) $ (vacía_if_not_supported),)
# $ (En silencio)> y 2 echo "*** Este sistema operativo no es compatible:" `uname -a`; salida 1;
#endif
2>
Referencia indefinida a `void g1satbcardtableModrefbs :: write_ref_array_pre_work <oopdesc*> (oopdesc **, int) '
Solución: Establezca g1satbcardtableModrefbs.cpp en hotspot/src/share/vm/gc_implementation/g1
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)); }}} Agregue el siguiente contenido al contenido
// 2017-10-19 Vicent_chen agregó 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 (estrechaop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} // 2017-10-19 Vicent_chen agregado
Ponga el g1satbcardtableModrefbs.hpp en hotspot/src/share/vm/gc_implementation/g1 de la siguiente manera
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 (estrechón* dst, int count, bool dest_uninitialized) {if (! Dest_uninitialized) {write_ref_array_pre_work (dst, count); }}
Comente fuera y luego agregue virtual void write_ref_array_pre (OOP* dst, int count, bool dest_uninitialized); virtual void write_ref_array_pre (estrechaop* dst, int count, bool dest_unintialized);
3>
Error: el tiempo es más de 10 años desde el presente: 1136059200000
resolver:
La siguiente hora en OpenJDK/JDK/SRC/Share/Classes/Java/Util/CurrencyData.Properties se cambia a los 10 años.
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; intente
VE = VEB; 2008-01-01-04-00-00; VEF
4> En el futuro, al compilar rmiserveriMpl_stub.class, es probable que la memoria sea insuficiente, porque observé a través del monitor del sistema que la memoria ha aumentado bruscamente durante este período. No sé la razón específica, pero he estado volviendo a entrar el comando Make varias veces seguidas, hasta la última vez
Éxito de nuevo. Entonces, cuando te encuentres con esta situación, puedes volver a hacerlo muchas veces. La última vez que la memoria no se disparó.
La compilación es exitosa de la siguiente manera:
Luego puede encontrar su JDK compilado en la carpeta de compilación.
Gracias a todos, si tienen alguna pregunta, por favor pregúntame.
La explicación detallada anterior de la compilación basada en la máquina virtual de compilación JVM-OpenJDK es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.