Olá Pessoal, tudo bom?
Continuando a descrição sobre a Arquitetura da Java Virtual Machine, no artigo de hoje iremos descrever sobre o Subsistema de nome Class Loader. Esse é responsável por obter as informações que estão nos byte codes, arquivos .class, e carregá-las para os components internos da área de Runtime. Lembrando que esse artigo continuará a utilizar alguns conceitos sobre arquitetura de sistemas operacionais, assim termos desconhecidos podem surgir no contexto desse artigo. Peço nesses casos que me envie comentários a respeito desses termos, para que eu possa complementar o artigo e responder suas duvidas.
JVM – Class Loader Subsystem
Relembrando…
Na última parte do artigo sobre a Arquitetura da Java Virtual Machine, foi apresentado a Figura 01. Nessa figura foram exibidos alguns subsistemas existentes dentro da JVM.
Loading
Dentro da JVM o subsistema de Class Loader é responsável por carregar (load) os bytecodes das classes compiladas pelo Javac para o subsistema Runtime Data Area, o qual para simplificar nesse momento daremos o nome de Memória. Assim esse processo de carregamento é realizado durante a execução da JVM e não no tempo de compilação do código dos arquivos de extensão .java.
Apesar de mostrar apenas uma caixa com o nome Class Loader na Figura 01, não há apenas uma classe que represente o Class Loader, mas existe uma hierarquia de classes filhas da classe BootstrapClassLoader, conforme pode ser visto na Figura 02. A linha tracejada verde que existe na figura é a separação das classes criadas e mantidas pela comunidade Java, parte superior, das classes que você cria para seus projetos, parte inferior.
Cada classe dessa hierarquia possui atribuições e atividades diferenciadas, conforme descrição abaixo:
- Bootstrap Class Loader – Essa classe é criada quando a JVM é inicializada para ser processada. Ela é responsável por realizar o loading das classes das APIs do Java. Ao contrário de outras classes que possuem a função de class loader, esta classe é implementada diretamente na linguagem nativa da arquitetura do hardware da máquina, ou seja, utilizando-se de linguagem assembly. ((ClassLoader – Link))
- Extension Class Loader – Realiza o loading das classes de extensão da API do Java, dessa forma, não realizando o carregamento das APIs básicas do Java. Também realiza o loading de diversas classes de segurança do Java.
- System Class Loader – Se os classes loaders acima carregam componentes da API da JVM, esse class loader carrega as classes da sua aplicação. Assim ela realiza o carregamento das classes que estão especificadas dentro da variável global $CLASSPATH, a qual é especificado pelo desenvolvedor.
- User-Defined Class Loader – Class Loader criado pelo desenvolvedor em seu projeto. As atividades deste podem variar conforme a codificação realizada.
Cada Class Loader possui um namespace próprio que armazena as classes carregadas. Ao iniciar o carregamento de uma classe, existe uma busca baseado no FQCN (Fully Qualified Class Name, nome completo e qualificado da classe) que está armazenado no namespace, checando assim se a classe já foi carregada (load). Mesmo que a classe possua um FQCN identifico, mas com namespace diferente, o Class Loader deverá tratar como uma classe diferente.
Uma classe será carregada para a Memória ,via Class Loader, quando ocorrer a primeira referência desta no código em execução. Quando um class loader é requisitado para realizar o loading de uma classe, ele deverá verificar se esta classe existe em seu cache, caso não exista, verificará no cache do class loader pai e assim sucessivamente até chegar ao cache da classe BootstrapClassLoader.
Caso ao passar por todos os caches da hierarquia, a classe que está sendo requisitada para ser carregada não existir, esta será carregada. Esse loading será realizado pela classe ClassLoader requisitada no momento inicial do carregamento e dentro do cache desse ClassLoader é que a classe será armazenada. Dessa forma, uma classe filha poderá procurar classes carregadas em um class loader pai, mas o contrário não é verdadeiro.
Por fim, uma classe Class Loader poderá carregar uma classe em memória, mas o contrário não pode ocorrer. Ao invés disso a classe carregada poderá ser deletada e, quando for necessário, uma nova classe poderá ser carregada.
Linking
Além de realizar esse loading dos bytecodes, o subsistema do Class Loader realiza um procedimento muito importante que é a lincagem (link) desses bytecodes entre si. Se ocorreu do class loader encontrar uma classe que ainda não foi carregada para memória, esta o será via processo mostrado na Figura 03.
Existem cinco atividades que compõem esse processo, sendo descritas abaixo:
- Loading: Atividade que obtém os bytecodes de um arquivo .class e realiza o carregamento desta para a memória da JVM
- Verifying: Atividade que checa se os bytecodes gerados formam uma classe válida. Essa validação ocorre através da Java Language Specification e da Java Virtual Machine Specification. Essa é a atividade mais complexa do processo e normalmente leva um longo período de tempo.
- Preparing: Atividade que realiza a preparação da estrutura de dados que especifica a memória necessária pelas classes e mostra os atributos, métodos e interfaces definidas na classe que está realizando o load e link.
- Resolving: Atividade que troca todas as referências simbólicas (symbolic references) do conjunto de classes para referências diretas (direct references)
- Initializing: Atividade que inicializa os atributos de uma classes com valores proprietários, além de executar inicializadores estáticos (blocos estáticos – static blocks) e atributos estáticos com seus valores pré definidos.
Outras informações
Servidores Web (Web Application Server – WAS), como Apache TomCat, JBoss entre outros, utilizam o class loader para que as aplicações Web e as Enterprise Applications possam rodar independentemente. Em outras palavras, isso garante que haverá uma independência entre as aplicações através do subsistema de Class Loader. Essa estrutura hierarquica pode variar entre os produtores de WAS.
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply