JVM(Máquina Virtual Java) actua como um motor de tempo de execução para executar aplicações Java. JVM é aquele que na realidade chama o método principal presente num código java. JVM é uma parte de JRE(Java Runtime Environment).
Java applications are called WORA (Write Once Run Anywhere). Isto significa que um programador pode desenvolver código Java num sistema e pode esperar que seja executado em qualquer outro sistema compatível com Java sem qualquer ajuste. Tudo isto é possível devido a JVM.
Quando compilamos um ficheiro .java, ficheiros .class(contém código byte) com os mesmos nomes de classe presentes no ficheiro .java são gerados pelo compilador Java. Este ficheiro .class entra em vários passos quando o executamos. Estes passos em conjunto descrevem todo o JVM.
Subsistema de Carregador de Classes
p> É principalmente responsável por três actividades.
- Loading
- Link
- Initização
Loading: O carregador de classes lê o ficheiro “.class”, gera os dados binários correspondentes e guarda-os na área do método. Para cada ficheiro “.class”, a JVM armazena as seguintes informações na área do método.
- O nome totalmente qualificado da classe carregada e a sua classe pai imediata.
- Se o ficheiro “.class” está relacionado com Classe ou Interface ou Enum.
- Modificador, Variáveis e informação de Método etc.
Após carregar o ficheiro “.class”, JVM cria um objecto do tipo Class para representar este ficheiro na memória da pilha. Note-se que este objecto é do tipo Class predefinido no pacote java.lang. Estes objectos de Classe podem ser utilizados pelo programador para obter informação de nível de classe como o nome da classe, nome do pai, métodos e informação variável, etc. Para obter este objecto de referência podemos utilizar o método getClass() da classe Objecto.
>/p>
>/p>
>/div>>>/div>
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
public
class
Test {
public
static
void
main(String args)
{
Student s1 =
new
Student();
Class c1 = s1.getClass();
System.out.println(c1.getName());
Method m = c1.getDeclaredMethods();
for
(Method method : m)
System.out.println(method.getName());
Field f = c1.getDeclaredFields();
for
System.out.println(field.getName());
}
}
class
Student {
private
String name;
private
int
roll_No;
public
String getName() {
return
name; }
public
void
setName(String name) {
this
.name = name; }
public
int
getRoll_no() {
return
roll_No; }
public
void
setRoll_no(
int
roll_no)
{
this
.roll_No = roll_no;
}
}
StudentgetNamesetNamegetRoll_nosetRoll_nonameroll_No
Nota: Para cada carregamento “.classe”, é criado apenas um objecto da classe.
Student s2 = new Student();// c2 will point to same object where // c1 is pointingClass c2 = s2.getClass();System.out.println(c1==c2); // true
Link: Realiza verificação, preparação, e (opcionalmente) resolução.
- Verificação: Assegura a correcção do ficheiro .class, ou seja, verifica se este ficheiro está correctamente formatado e gerado por um compilador válido ou não. Se a verificação falhar, obtemos a excepção de tempo de execução java.lang.VerifyError. Esta actividade é feita pelo componente ByteCodeVerifier. Uma vez concluída esta actividade, o ficheiro de classe está pronto para compilação.
- Preparação: JVM aloca memória para variáveis de classe e inicializa a memória para valores padrão.
- Resolução: É o processo de substituição de referências simbólicas do tipo por referências directas. É feito através de pesquisa na área do método para localizar a entidade referenciada.
Initização: Nesta fase, todas as variáveis estáticas são atribuídas com os seus valores definidos no código e bloco estático(se houver). Isto é executado de cima para baixo numa classe e de pai para filho na hierarquia de classes.
Em geral, existem três carregadores de classe :
- Carregador de classe Bootstrap: Cada implementação da JVM deve ter um carregador de classes bootstrap, capaz de carregar classes de confiança. Carrega classes centrais de API java presentes no directório “JAVA_HOME/jre/lib”. Este caminho é popularmente conhecido como o caminho do bootstrap. É implementado em linguagens nativas como C, C++.
- Carregador de classes de extensão: É uma criança do carregador de classes bootstrap. Carrega as classes presentes nos directórios de extensões “JAVA_HOME/jre/lib/ext”(caminho de extensão) ou qualquer outro directório especificado pela propriedade do sistema java.ext.dirs. É implementado em java pela classe sun.misc.Launcher$ExtClassLoader.
- Carregador de classes do sistema/aplicação: É uma criança da carregadora da classe de extensão. É responsável por carregar classes a partir da classpath da aplicação. Utiliza internamente a Variável Ambiente que mapeou para java.class.path. É também implementado em Java pela classe sun.misc.Launcher$AppClassLoader.
>/p>
>>/p>
public
class
Test {
public
static
void
main(String args)
{
System.out.println(String.
class
.getClassLoader());
System.out.println(Test.
class
.getClassLoader());
}
}
>/div>>/div>
nulljdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
Nota: A JVM segue o princípio da Delegação-Hierarquia para carregar classes. O pedido de carga delegado de classe de sistema ao carregador de classe de extensão e o pedido de carga delegado de classe de extensão ao carregador de classe de bootstrap. Se uma classe encontrada no caminho da correia de arranque, a classe é carregada, caso contrário o pedido é novamente transferido para o carregador de classe de extensão e depois para o carregador de classe de sistema. Finalmente, se o carregador de classe do sistema não conseguir carregar a classe, então obtemos a excepção java.lang.ClassNotFoundException.
JVM Memory
- Área do método: Na área do método, toda a informação de nível de classe como nome da classe, nome imediato da classe mãe, informação sobre métodos e variáveis, etc., são armazenados, incluindo variáveis estáticas. Existe apenas uma área de método por JVM, e é um recurso partilhado.
- Área de pilha: A informação de todos os objectos é armazenada na área da pilha. Há também uma área de pilha por JVM. É também um recurso partilhado.
- Área de pilha: Para cada linha, JVM cria uma pilha de tempo de execução que é armazenada aqui. Cada bloco desta pilha é chamado de registo de activação/estrutura de pilha que armazena métodos de chamadas. Todas as variáveis locais desse método são armazenadas na sua moldura correspondente. Depois de um thread terminar, a sua pilha de tempo de execução será destruída pela JVM. Não é um recurso partilhado.
- Registos de PC: Endereço de armazenamento da instrução de execução actual de um thread. Obviamente, cada thread tem registos de PC separados.
- pilha de métodos nativos: Para cada thread, é criada uma pilha nativa separada. Armazena informação sobre o método nativo.
Motor de execução
Motor de execução executa a “.class” (bytecode). Lê o byte-código linha a linha, utiliza dados e informações presentes em várias áreas de memória e executa instruções. Pode ser classificado em três partes:
- Intérprete: Interpreta o bytecode linha a linha e depois executa. A desvantagem aqui é que quando um método é chamado várias vezes, sempre que é necessária interpretação.
- Just-In-Time Compiler(JIT) : É utilizado para aumentar a eficiência de um intérprete. Compila todo o bytecode e altera-o para código nativo, pelo que sempre que o intérprete vê repetidas chamadas de método, o JIT fornece código nativo directo para essa parte, pelo que não é necessária uma reinterpretação, pelo que a eficiência é melhorada.
- Colector de Lixo: Destrói objectos não referenciados. Para mais informações sobre o Colector de Lixo, consultar Garbage Collector.
Java Native Interface (JNI) :
É uma interface que interage com as Native Method Libraries e fornece as bibliotecas nativas (C, C++) necessárias para a execução. Permite à JVM chamar bibliotecas C/C++ e ser chamada por bibliotecas C/C++ que podem ser específicas do hardware.
Bibliotecas do Método Nativo :
É uma colecção das Bibliotecas Nativas(C, C+++) que são requeridas pelo Motor de Execução.
Este artigo é contribuído por Gaurav Miglani. Se gosta de GeeksforGeeks e gostaria de contribuir, pode também escrever um artigo utilizando o contribute.geeksforgeeks.org ou enviar o seu artigo por correio para [email protected]. Veja o seu artigo que aparece na página principal de GeeksforGeeks e ajude outros Geeks.
Por favor escreva comentários se encontrar algo incorrecto, ou se quiser partilhar mais informação sobre o tópico discutido acima.