Java Virtual Machine
Bruno Coan
Agenda
• Introdução a JVM
• Parâmetros
• Garbage Collection
• Just in time compiler JIT
• ClassLoader
Java Virtual Machine
O que é?
Java Code (.java)
JAVAC compiler
JVM JVM
Byte Code (.class)
JVM
Windows Linux Mac
Distribuições
• HotSpot – Oracle/Sun (base)
• JRockit - Oracle/BEA
• J9 – IBM.
Scala
JVM
Byte Code
Clojure JRuby
Linguagens que rodam na JVM
Parâmetros
O que são?
Para que servem?
Parâmetros
-Xmxs1024m Configuração de memória Heap
-Xmx1024m Configuração de memória Heap
-XX:MaxPermSize=128m Configuração da Permanent Generation
-verbose:gc Habilita log do garbage Collector
-Xint Desabilita o JIT
Garbage Collection
Mark-And-Sweep
• Mark
• Sweep
Hipótese das Gerações
• 95% dos objetos tem vida extremamente
curta.
• O restante costuma ter vida longa.
Generational Copying
Young
Generation
Old Generation
HotSpot
Eden
Survivor
0
Survivor
1
Young Ternured
Minnor Collect Major Collect
Mark-And-Sweep + Compact
Divisão de Memória - JVM
Collector Serial
Collector Parallel
Collector Concurrent
Garbage First – G1
Ergonomics
• A partir java 1.5;
• O algoritmo de Garbage Collection;
• O tamanho da memória heap;
• O compilador de tempo de execução.
Just in Time Compiler - JIT
• Java 1.1 (Symantec)
• Compilação dinâmica
• Heurística
Cliente
• Habilitado através do parâmetro –client;
• Foco em inicialização rápida;
• Deixa de fazer certas otimizações para
economizar memória;
Servidor
• Habilitado através do parâmetro –server;
• Performance a longo prazo;
• Compilação mais agressiva;
Recomendação
• Programe baseado em boas práticas;
• O JIT faz o resto;
Carregamento de classes
• Loading -Localiza o arquivo (.class) e carrega seu ByteCode;
• Linking
– Verification -Verifica se o ByteCode está correto;
– Preparation –Prepara estrutura para acomodar métodos,
atributos;
– Resolving –Carrega todas as dependências referenciadas
pela classe;
• Initializing –Blocos estáticos são executados e atributos
estáticos são inicializados;
ClassLoaders
• BootStrap
– Único que não possui pai;
– Carrega classes do rt.jar (java.lang);
• Extension
– Tem BootStrap como pai;
– Carrega classes da pasta lib/ext;
• Application
– Tem Extension como pai;
– Carrega classes do CLASSPATH;
BootStrap Classloader
Extension Classloader
Application Classloader
ClassLoaders Container
BootStrap Classloader
Extension Classloader
Application Classloader
Container ClassLoader
WebApp1
ClassLoader
WebApp2
ClassLoader
ClassLoader Hell
• NoSuchMethodError;
• ClassCastException;
• Java 1.6 incluiu API JAXB 2.0
Endorsed
• Configurado pelo parâmetro -Djava.endorsed.dirs=;
• Jars carredos antes do diretório ext ;
• Maneira de dizer para JVM que você confia em
determinado jar;
Introdução Java virtual machine
Introdução Java virtual machine

Introdução Java virtual machine

Notas do Editor

  • #4 Jvm é uma especificação, ela interpreta bytecode converte em comandos de máquina e os executa, isso é o que torna possível escrever um único código e executálo em várias plataformas.
  • #6 A variedade de jvms existente aumenta também a competitividade no mercado, pois cada fabricante melhora aspectos a cada versão, além de não ficar preso a um fabricante.
  • #9 São uma forma de fazer ajustes na JVM , e controlar detalhes de seu funcionamento como quantidade de memória
  • #11 Dificuldade de gerenciamento de memória para os desenvolvedores Java usa gc como? Objeto liberado fica disponível para ser coletado Porém não dá pra previnir quando ele será coletado.
  • #12 Quando se pensa em coleta de lixo, primeira coisa que vem na mente é um serviço que varre a memória de tempo em tempo e remove os objetos sem referencia
  • #13 Alto indice de mortalidade infantil entre objetos
  • #14 Parece mais custoso pois tem que copiar e apagar. Apesar de copiar ser custoso, isso é feito em apenas 5% dos objetos Então não apaga o restante, apenas marca a memória como livre para ser escrita
  • #15 Na hotSpot a memória é dividida da seguinte maneira. Os objetos são instanciados no espaço eden, após a primeira collection os objetos sobreviventes são copiados para um dos survivors e a partir de então são copiados entre os 2 survivors até serem considerados maduros. Em algum momento a old generation tbm se enche, então é necessário executar uma coleta, nesse pedaço de memória o algortimo usado é o M.A.S
  • #16 Como a gente viu o mark and sweep causa problemas de fragmentação, por isso o algoritmo executado tem mais uma fase chamada compact, que realiza a desfragmentação da memória. Agumas jvms como jrockit não se preocupam muito com essa fragmentação e executam o compact apenas quando necessário
  • #18 Ideal para máquinas que possuem processadores de apenas um nucleo
  • #19 Máquinas com processadores de muitos núcleos Perde tempo de sincronização
  • #23 Apenas interpretava bytecode e executava em linguagem de máquina Muito lenta Durante a execução do programa análisa e detecta pontos importantes e compila pra código de máquina otimizados Heuristicas (rollback) E descartar códigos compilados caso não sejam mais utilizados
  • #28 Hierarquia de Carregamento Traz segurança As aplicações podem criar seus próprios classloaders
  • #29 Container cria seu próprio class loader carrega classes do lib E um para cada app (contexto) classes do webinf/lib