La raison pour laquelle Java est promu est en fait une grande raison car elle est multiplateforme, et son grand rôle est à cause de la relation de machine virtuelle.
De manière générale, les développeurs n'ont pas besoin de faire attention à la mise en œuvre interne des machines virtuelles pour se développer quotidiennement, mais parfois en ce qui concerne les performances, ils doivent comprendre le mécanisme de mise en œuvre des machines virtuelles.
Donc, ce que j'ai écrit aujourd'hui, c'est davantage de compiler un ensemble de vos propres machines virtuelles pour ouvrir la voie à la compréhension des principes sous-jacents des machines virtuelles à l'avenir.
La compilation des machines virtuelles peut rencontrer de nombreux pièges et cela prendra du temps. En raison des différences dans notre environnement, les problèmes que nous pouvons rencontrer sont incohérents.
Je peux seulement dire que j'ai répertorié tous les problèmes que j'ai rencontrés, juste comme faire des éclaboussures.
1 Tout d'abord, nous devons télécharger le code source d'OpenJDK. Cet OpenJDK a en fait un historique de version. Vous pouvez en apprendre davantage.
Ensuite, la plupart du contenu du code source ici est le même que le contenu Oracle JDK, et quelques contenus sont différents.
Le code source d'OpenJDK que j'ai téléchargé ici est OpenJDK-7U75-SRC-B13-18_DEC_2014.zip. La version de chacun peut être différente, mais c'est le code source d'OpenJDK.
2 En plus de préparer les choses ci-dessus, vous devez également préparer un Oracle JDK. J'utilise JDK-6U32-LINUX-X64.bin pour ce JDK.
3 Préparez ensuite diverses dépendances sur Linux d'abord. Ces dépendances seront obtenues plus tard. De plus, je veux parler du système Linux ici.
Il s'agit du 16.04LTS 64 bits d'Ubuntu, il est donc préférable de préparer 64 bits pour les choses précédentes.
Tout est prêt, maintenant nous allons commencer à travailler! ! ! !
1 Si vous définissez la variable de l'environnement Java_Home ou ClassPath avant, veuillez d'abord commenter.
2 Unzip OpenJDK-7U75-SRC-B13-18_DEC_2014.zip et obtenez le dossier OpenJDK. Nous l'avons mis sous / usr.
3ExECUTE JDK-6U32-LINUX-X64.BIN pour obtenir le dossier JDK1.6.0_32. Parlons de mettre ce dossier dans / usr / java.
4 entrez VIM / etc / profil et ajoutez le contenu suivant à la fin:
Export Lang = C # Bootstrap-JDK Chemin d'installation, remplacez-le par le chemin d'accès de Bootstrap-JDK Export alt_bootdir = / usr / java / jdk1.6.0_32 # Idem que ci-dessus, j'ai utilisé OpenJDK pour compiler, et lorsque j'ai couru HotSpot, je l'ai remplacé par Oraclejdk. Les lecteurs peuvent le remplacer directement par OracleJdKExport Alt_JDK_Import_Path = / USR / Java / JDK1.6.0_32 # Spécifiez plusieurs threads pour exécuter ce script export hotspot_build_jobs = 4Export Alt_Parall_Compile Build_jaxws = false # export build_jaxp = false # export build_corba = falsexport build_hotspot = trueExport build_jdk = trueExport skip_compare_images = truebuild_deploy = falsebuild_install = false # le chemin vers le résultat compilé. Export alt_outputdir = / usr / openjdk / buildExport allow_downloads = true # Les deux variables d'environnement doivent être supprimées, sinon il y aura des problèmes unset java_homeunset classpathmake 2> & 1 | tee $ alt_outputdir / build.log
Notez que la source / etc / le profil est nécessaire pour mettre à jour la configuration. Mais après la contribution, il s'exécutera immédiatement, mais il ne réussira pas maintenant car cela dépend de ceux qui n'ont pas encore été faits. Appuyez immédiatement à Ctrl + C pour faire une pause.
5 Exécutez certaines commandes dans le terminal pour installer les dépendances nécessaires, les commandes sont les suivantes:
sudo apt-get install build-essential GAWK M4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-imprint-dev binutils libmotif-common-commun
Certains endroits sont également installés OpenJDK-6-JDK. En fait, il est préférable de ne pas l'installer ici. Nous utilisons Oracle JDK pour compiler notre code source OpenJDK. Il n'est pas recommandé d'utiliser OpenJDK-6-JDK pour compiler le code source OpenJDK. C'est pourquoi l'adresse JDK indiquée dans mon script build.sh est exportant alt_bootdir = / usr / java / jdk1.6.0_32.
6 Maintenant, nous allons dans le répertoire / usr / openjdk pour exécuter la commande MADEITY et vérifiez si la configuration est OK. S'il n'y a pas de problème, il sera affiché
70 000 choses sont disponibles, seul le vent est nécessaire, entrez la marque et commencez à compiler. Les choses compilées seront générées dans le répertoire / usr / openjdk / build.
C'est le processus, mais certains problèmes se produiront au cours de cette période. Selon les erreurs signalées par lui, nous devons corriger certaines erreurs. Après correction, nous continuerons à faire la commande puis à compiler.
Voici quelques erreurs et solutions que j'ai rencontrées.
1>
Echo "*** Ce système d'exploitation n'est pas pris en charge:" `uname -a`; sortie 1;
openjdk / hotspot / make / linux / makefile: 240: recette pour cible 'check_os_version' a échoué
résoudre:
Commentez les trois lignes suivantes de Check_OS_Version dans / OpenJDK / Hotspot / Make / Linux / Makefile
check_os_version:
#ifeq ($ (disable_hotspot_os_version_check) $ (vide_if_not_supported),)
# $ (Tranquillement)> & 2 echo "*** Ce système d'exploitation n'est pas pris en charge:" `uname -a`; sortie 1;
#endif
2>
Référence non définie à `void g1satbcardtableModrefbs :: write_ref_array_pre_work <oopdesc *> (oopdesc **, int) '
Solution: Définissez G1SATBCARDTABLEMODREFBS.CPP dans Hotspot / Src / Share / VM / GC_IMPLATION / G1
modèle <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; pour (int i = 0; i <count; i ++, elem_ptr ++) {t heap_oop = oopdes :: load_heap_oop (elem_ptr); if (! oopDesc :: is_null (heap_oop)) {enqueue (oopdes :: decode_heap_oop_not_null (heap_oop)); }}} Ajoutez le contenu suivant au contenu
// 2017-10-19 vicent_chen a ajouté 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 (étroite * dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} // 2017-10-19 Vicent_chen ajouté
Mettez le g1satbcardtableModrefbs.hpp dans hotspot / src / share / vm / gc_implementation / g1 comme suit
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 (étroite * dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }}
Commentez, puis ajoutez Virtual void write_ref_array_pre (OOP * dst, int count, bool dest_uninitialized); virtual void write_ref_array_pre (étroite * dst, int count, bool dest_unintialized);
3>
Erreur: le temps est à plus de 10 ans de présent: 1136059200000
résoudre:
L'heure suivante dans le fichier OpenJDK / JDK / SRC / Share / Classes / Java / Util / CurrencyData.Properties est passée en 10 ans.
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; essayez
Ve = VEB; 2008-01-01-04-00-00; VEF
4> À l'avenir, lors de la compilation de rmiserverImpl_stub.class, il est probable que la mémoire soit insuffisante, car j'ai observé par le moniteur système que la mémoire a fortement augmenté au cours de cette période. Je ne connais pas la raison spécifique, mais je suis réintégré la commande de Make plusieurs fois de suite, jusqu'à la dernière fois
Succès à nouveau. Ainsi, lorsque vous rencontrez cette situation, vous pouvez le refaire plusieurs fois. La dernière fois que la mémoire n'a pas monté en flèche.
La compilation est réussie comme suit:
Ensuite, vous pouvez trouver votre JDK compilé dans le dossier de construction.
Merci à tous, si vous avez des questions, posez-moi.
L'explication détaillée ci-dessus de la compilation basée sur la machine virtuelle de compilation jvm-openjdk est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.