Bytecode interpretado é executado pela JVM ou pelo SO?

Pessoal,

Antes de vir aqui eu dei uma olhada em vídeos, procurei bastante no google e também por aqui, mas não achei nada que pudesse sanar minha dúvida integralmente.

A grosso modo, a JVM interpreta os bytecode compilados pelo o javac, o hotspot identifica os “pontos quentes” do bytecode resultante da compilação que são executados com maior frequência e o JIT é responsável por pegar esses pontos e compilar para um linguagem de máquina de um computador subjacente.

Minha pergunta é essa mesma que está no título… esse código de linguagem de máquina no qual foi gerada pelo o JIT, é executado pela JVM ou pelo SO?

Amplamente sempre vejo que é o JVM que executa, mas como é uma linguagem de máquina, não seria apenas o computador capaz de compreender e executar?

Outra pergunta seria, todo o bytecode é compilado para linguagem de máquina pelo o JIT ou somente os “pontos quentes”?

Vlww

1 curtida

1-A grosso modo, a JVM interpreta os bytecode compilados pelo o javac, o hotspot.
Sim, para entender melhor o Hotspot é uma implementação de jvm, então ela é a jvm em si, mas pode escolher outras.

2- JIT é responsável por pegar esses pontos e compilar para um linguagem de máquina de um computador subjacente.

JIT é o compilador que roda na jvm, encontrando pontos que se repetem com muita frequência, ele otimiza esse trecho para aumentar sua performance, transformando em códigos nativo da arquitetura da maquina.

O código interpretável pela jvm é bytecode, porém ele também tem que gerar código que o S.O possa interpretar na hora de sua execução.

ByteCode > JVM > Linguagem de Maquina > S.O Só executa.

3-É executado pela JVM ou pelo SO?Amplamente sempre vejo que é o JVM que executa, mas como é uma linguagem de máquina, não seria apenas o computador capaz de compreender e executar?

É executado pelo S.O. A JVM é um computador virtual que serve como interpretando e gerenciador de tudo que acontece com alguma aplicação que está sendo rodada(“executada”) por ela.
O S.O faz apenas o trabalho dele de executar e servir a JVM com o que é requisitado por ela.

https://www.caelum.com.br/apostila-java-orientacao-objetos/o-que-e-java/maquinavirtual2.png

4-todo o bytecode é compilado para linguagem de máquina pelo o JIT ou somente os “pontos quentes”?

Então, a vantagem do JIT é que ele otimiza trechos do código a partir da necessidade. Em um primeiro momento ele pode otimizar um trecho de uma maneira, porém, por não ser estático em outra passagem ele pode perceber que aquele trecho pode ser otimizado de outra maneira e o fará.

Novamente,

Primeiro ciclo : ( bytecode > JVM- “é capaz de interpretar bytecode e gera código de maquina” > S.O executa)

Segundo ciclo (bytecode > JVM - Trecho quente detectado > JIT > JVM > S.O)

Terceiro ciclo(bytecode > JVM > Novo código já otimizado > S.O)

Quarto ciclo(bytecode > JVM > Trecho quente > JIT > código mais otimizado > S.O )

Quinto ciclo(bytecode > JVM > Trecho quente > JIT > código mais otimizado ainda > S.O)

https://www.caelum.com.br/apostila-java-orientacao-objetos/o-que-e-java/#2-3-maquina-virtual

nota: Não sou especialista, mas com conhecimentos adquiridos até o momento é assim que estou interpretando seu funcionamento.

3 curtidas

Man,

Obrigado por sanar algumas dúvidas, mais ainda não fiquei convencido que de fato é o SO que executa, pois estou com o livro do DEITEL, onde informa que “a JVM executa os bytecodes do programa, realizando assim as ações especificadas pelo programa”.

Só posso inferir mediante a informação acim que o JVM executa esse código de linguagem de máquina concebido pelo JIT e não o SO.

Vlww

Nesse link da caelum que você me mandou, possui a seguinte informação:

“Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM).”

“Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM).”

Então, isso me deu uma duvida também. Mas depois de analisar, a JVM não passa de um programa que está em execução em uma Thread do S.O. Se ela fosse independente do S.O, então poderíamos retirar o mesmo e fazer tudo apenas com a JVM que iria conversar diretamente com o hardware de qualquer tipo de arquitetura e teria também os drivers da mesma, Pois a missão do S.O é intermédia a conversa com o Hardware e para isso ele traz uma bagagem de ferramentas o que aumentaria o peso e complexidade da JVM.
Estou extrapolando para ficar mais evidente que quem está fazendo a execução final é o S.O. Imagine, teríamos até que ter drives de JVM para conversar com a impressora xD ou baixar um novo driver do mouse com tecnologia diferente que acabamos de comprar.

O conceito de JVM está mais para contêiner, posso estar sendo um pouco ousado em citar isso, mas vendo um pouco de Spring e Docker é o que me vem em mente onde tem a capacidade de fazer o mesmo papel básico que seria gerenciar todo o ciclo de vida da aplicação.

Sim, ela roda sem envolvimento do S.O, pois quem está gerenciando a aplicação é a JVM não o S.O. Por assim dizer, quando escrevo o comando, System.out.println(“ola”); ou new Thread, não estou mandando instruções para S.O e sim para JVM. Quem provavelmente ira solicitar uma nova Thread será a JVM e quem ira ceder recurso é o sistema operacional.

“Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM).”

“E a JVM executa os bytecodes do programa, realizando assim as ações especificadas pelo programa”.

Em resumo, os 2 contextos estão apontando para a mesma questão, a JVM gerencia a sua aplicação e sim ela executa o que o seu código pede, porém essa execução poderia ser interpretada como uma requisição ao S.O para que faça algo.

No caso, o intermediador do Hardware, sempre, sempre é o sistema operacional. De novo é minha interpretação com a minha analise.
Vou manda até para avaliação no grupo do telegram kk.

Cara,

Obrigadaço pela explicação, acho que as coisas estão começando a se encaixar.

Mais uma pergunta…

Toda vez que um aplicativo java é executado ele é interpretado? Ou seja, diferentemente de uma compilação tradicional que gera o executável e pronto, no java, toda vez que o aplicativo é executado ele é interpretado onde o JVM realiza otimizações?

Toda vez que um aplicativo java é executado ele é interpretado?

Não, sempre quando você roda a sua aplicação ele irá compila-lo gerando o bytecode, por sua vez a JVM ira interpretá-lo gerando o código de maquina.

Ou seja, diferentemente de uma compilação tradicional que gera o executável e pronto, no java, toda vez que o aplicativo é executado ele é interpretado onde o JVM realiza otimizações?

O JIT armazena na memória trechos que foram otimizados daquele bytecode. Importante entender que a otimização do JIT e a interpretação da JVM acontecem em tempo de execução.

Seguindo o fluxo:

JVM interpreta o bytecode > JIT gerá código nativo e otimizado em seguida armazena no cache > JVM gera o código de maquina mesclado com o código otimizado do JIT quando necessário irá utiliza-lo ao invés de interpretar o bytecode.