A razão pela qual o Java é promovido é realmente um grande motivo, porque é uma plataforma cruzada, e seu grande papel é por causa do relacionamento virtual da máquina.
De um modo geral, os desenvolvedores não precisam prestar atenção à implementação interna de máquinas virtuais para se desenvolver diariamente, mas às vezes quando se trata de desempenho, precisam entender o mecanismo de implementação das máquinas virtuais.
Então, o que escrevi hoje é mais sobre a compilação de um conjunto de suas próprias máquinas virtuais para pavimentar o caminho para entender os princípios subjacentes das máquinas virtuais no futuro.
Compilar máquinas virtuais pode encontrar muitas armadilhas e isso levará tempo. Devido às diferenças em nosso ambiente, os problemas que podemos encontrar são inconsistentes.
Só posso dizer que listei todos os problemas que encontrei, apenas gosto de fazer um respingo.
Primeiro de tudo, devemos baixar o código -fonte do OpenJDK. Este OpenJdk realmente tem um histórico de versões. Você pode aprender sobre isso.
Em seguida, a maioria do conteúdo do código -fonte aqui é o mesmo que o conteúdo do Oracle JDK, e alguns conteúdos são diferentes.
O código-fonte do OpenJDK que eu baixei aqui é OpenJDK-7U75-SRC-B13-18_DEC_2014.ZIP. A versão de todos pode ser diferente, mas é o código -fonte do OpenJDK.
2 Além de preparar as coisas acima, você também precisa preparar um Oracle JDK. Eu uso o JDK-6U32-Linux-x64.bin para este JDK.
3 Em seguida, prepare várias dependências do Linux primeiro. Essas dependências serão obtidas posteriormente. Além disso, quero falar sobre o sistema Linux aqui.
São 16.04LTs de Ubuntu, por isso é melhor preparar 64 bits para as coisas anteriores.
Tudo está pronto, agora vamos começar a trabalhar! ! ! !
1 Se você definir a variável Java_Home ou ClassPath Environment antes, comente primeiro.
2 UNZIP OPENJDK-7U75-SRC-B13-18_DEC_2014.zip e obtenha a pasta OpenJDK. Colocamos em /usr.
3Execute jdk-6u32-linux-x64.bin para obter a pasta JDK1.6.0_32. Vamos falar sobre colocar essa pasta em /usr /java.
4 Digite Vim /etc /perfil e adicione o seguinte conteúdo no final:
Exportar Lang = C#Bootstrap-JDK Caminho de instalação, substitua-o pelo caminho da exportação de bootstrap-jdk alt_bootdir =/usr/java/jdk1.6.0_32#O mesmo que acima, usei o OpenJDK para compilar e, quando corri o Hotspot, o substituí pelo Oraclejdk. Os leitores podem substituí -lo diretamente por oraclejdkexport alt_jdk_import_path =/usr/java/jdk1.6.0_32#Especifique vários threads para executar esse script exportar HotSpot_build_jobs = 4export alt_parall_compile_jobs = 4#o conteúdo a ser compilado, o conteúdo a ser compunhado, 4export alt_parall_compile_jobs = 4#o conteúdo a ser Build_jaxws = false#export ed ed. Export alt_outputdir =/usr/openjdk/buildexport allower_downloads = true#as duas variáveis de ambiente precisam ser removidas; caso contrário, haverá problemas sem definir java_homeunset ClassPathmake 2> & 1 | tee $ alt_outputdir/build.log
Observe que a origem /etc /perfil é necessária para atualizar a configuração. Mas após a entrada, ele será executado imediatamente, mas não terá sucesso agora porque depende daqueles que ainda não foram feitos. Pressione Ctrl+C imediatamente para pausar.
5 Execute alguns comandos no terminal para instalar as dependências necessárias, os comandos são os seguintes:
sudo apt-get install instalar-essencial gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common Ant
Alguns lugares também têm o OpenJDK-6-JDK instalado. De fato, é melhor não instalar isso aqui. Usamos o Oracle JDK para compilar nosso código -fonte OpenJDK. Não é recomendável usar o OpenJDK-6-JDK para compilar o código-fonte do OpenJDK. É por isso que o endereço JDK apontado no meu script Build.sh é exportar alt_bootdir =/usr/java/jdk1.6.0_32.
6 Agora vamos ao diretório /usr /openjdk para executar o comando Make Sanity e verifique se a configuração está ok. Se não houver problema, será exibido
70.000 coisas estão disponíveis, apenas o vento leste é necessário, entra e comece a compilar. As coisas compiladas serão geradas no diretório/usr/openjdk/build.
Este é o processo, mas alguns problemas ocorrerão durante esse período. De acordo com os erros relatados por ele, precisamos corrigir alguns erros. Após a correção, continuaremos a fazer o comando e depois compilar.
Aqui estão alguns erros e soluções que encontrei.
1>
eco "*** Este sistema operacional não é suportado:" `uname -a`; saída 1;
OpenJdk/Hotspot/Make/Linux/Makefile: 240: Receita para Target 'check_os_version' falhou
resolver:
Comente as três linhas a seguir de check_os_version in/OpenJdk/hotspot/make/linux/makefile
check_os_version:
#ifeq ($ (desabille_hotspot_os_version_check) $ (email_if_not_supported),)
# $ (Silenciosamente)> & 2 echo "*** Este sistema operacional não é suportado:" `uname -a`; saída 1;
#endif
2>
Referência indefinida a `void g1satbcardtablemodrefbs :: write_ref_array_pre_work <oopdesc*> (oopdesc **, int) '
Solução: Definir G1satbcardtablemodrefbs.cpp em hotspot/src/share/vm/gc_implementation/g1
Modelo <classe T> void g1satbcardtablemodrefbs :: write_ref_array_pre_work (t* dst, int contagem) {if (! javathread :: satb_mark_queue_set (). is_active ()) return; T* elem_ptr = dst; para (int i = 0; i <contagem; 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); }}} Adicione o seguinte conteúdo ao conteúdo
// 2017-10-19 vicent_chen adicionou void g1satbcardtablemodrefbs :: write_ref_array_pre (oop* dst, int count, bool dest_uninitialized) {if (! Dest_uninitialized) {write_ref_reray_pre_work (dst, count); }} void g1satbcardtablemodrefbs :: write_ref_array_pre (estreito* dst, int contagem, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, contagem); }} // 2017-10-19 vicent_chen adicionado
Coloque o G1SATBCARDTABLEMODREFBS.HPP em hotspot/src/share/vm/gc_implementation/g1, como segue
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 (estreitooop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }}
Comente e adicione o virtual void write_ref_array_pre (oop* dst, int conting, bool dest_uninitialized); virtual void write_ref_array_pre (estreito* dst, int conting, bool dest_unintialized);
3>
Erro: o tempo é mais de 10 anos a partir do presente: 1136059200000
resolver:
No seguinte tempo no arquivo OpenJDK/JDK/SRC/Share/Classes/Java/Util/CurrencyData.Properties é alterado para 10 anos.
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; Tente
Ve = veb; 2008-01-01-04-00-00; vef
4> No futuro, ao compilar RMISERVERIMPL_STUB.CLASS, é provável que a memória seja insuficiente, porque observei através do monitor do sistema que a memória aumentou acentuadamente durante esse período. Não conheço o motivo específico, mas tenho entrado novamente no comando make várias vezes seguidas, até a última vez
Sucesso novamente. Então, quando você encontra essa situação, pode fazê -lo novamente muitas vezes. A última vez que a memória não disparou.
A compilação é bem -sucedida da seguinte maneira:
Em seguida, você pode encontrar seu JDK compilado na pasta Build.
Obrigado a todos, se tiver alguma dúvida, pergunte -me.
A explicação detalhada acima da compilação com base na máquina virtual de compilação JVM-Openjdk é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.