o ESIG Academy é um programa interno de formação sobre diversos temas de tecnologias. A aula de hoje foi sobre a estrutura interna da JVM, linguagens baseadas em JVM (Kotlin, Scala, Closure, Groovy..), Java Memory Model (Thread Stack, Heap, Non-Heap, Native, etc), os algoritmos de Garbage Collection (Serial, Parallel, CMS e G1), Conceitos de Carga de CPU (Load Avarege), Threads states, Event Pool x Thread por Request, JMX e GraalVM (AOT, polyglot apps, comparativos)..
2. JVM
• “Write once, run anyware”
• Multithreading nativo.
• Garbage Collection
• Bytecode verifier (segurança)
• Carregamento dinâmico de classes (Dynamic Classloading)
• As classes só são carregadas no momento que precisam ser usadas.
• Gerenciada e Monitorada (profiler, VisualGC, JConsole, JMX, etc)
• Interpretada mas compilada com JIT (Just in Time Compiler)
3. Linguagens e JVM
• A plataforma Java é diferente da linguagem Java.
• A Java Virtual Machine (JVM) é uma plaforma de execução de bytecodes.
Dezenas de
linguagens de
programação
11. Compilação
• JIT – Just In Time Compiler
• Compilação previa a interpretação do código.
• AOT – Ahead of Time Compiler
• Compilação antecipada (ahead of time = antes do tempo)
• Não suportada pela JVM tradicional (o AOT da JVM é apenas do bytecode)
• Suportada pela GraalVM
12.
13.
14.
15. JVM Memory Model
• Cada Thread possui sua área de variáveis locais,
denominado Thread Stack.
• 1 MB por padrão (java -
XX:ThreadStackSize=1024)
21. Generation Garbage Collector
Eden: Área inicialmente alocada para a
maioria dos objetos.
Espaço Sobrevivente (heap): O pool que
contém objetos que sobreviveram à
coleta de lixo do espaço Eden.
Geração tenured (heap): O pool que
contém objetos que já existiram por
algum tempo no espaço sobrevivente.
25. PermGen x MetaSpace
• PermGem é um espaço de heap especial separado do heap de
memória principal.
• Armazena métodos estáticos, classes, objetos estáticos, etc.
26. PermGen x MetaSpace
• Metaspace é um novo espaço de memória que substituí o PermGen
Space.
• Ele está vinculado a “Native Memory” que cresce automaticamente
por padrão.
• Ainda é possível estabelecer limites, caso queira:
36. Garbage Collection
• JVM tem 4 tipos de algoritmos de GC:
• Serial Garbage Collector
• Parallel Garbage Collector
• CMS Garbage Collector
• G1 Garbage Collector
37. Serial Collector
• Uma uma única thread para todas as coletas (menores e maiores).
• Algoritmo mais simples e exige menos recursos.
• Aumenta a parada da aplicação, pois uma única thread fará o GC e
todas as outras ficarão aguardando.
• Recomendado para dispositivos de pequena memória ou aplicações
monousuário (desktop).
38. Parallel GC
• Múltiplas threads para coletas menores e uma thread para coleta
maior.
• Também congela outros threads de aplicativo ao executar GC
• Parallel Old Collector – Multiplas threads para coletas principais e
secundárias. Desde o Java 7u4.
• Maior troughput em sistemas multi-cores.
39. CMS - Concurrent Mark and Sweep
• Use múltiplas GC Threads para a coleta de lixo.
• Projetado para aplicações que precisam de pausas menores de GC e
podem gerenciar seus recursos com o GC enquanto executam.
• Executam concorrentemente com a aplicação. Não pausam a App.
• Os aplicativos que usam este tipo de GC respondem mais lentamente,
em média, mas não param de responder para realizar a coleta de lixo.
• Usam mais recursos que o Parallel Collector.
• Bom para aplicações gerais no servidor.
40. CMS - Concurrent Mark and Sweep
• Se 98% do tempo for gasto com GC e liberar apenas 2% do Heap, um
OutOfMemory é disparado. (-XX:-UseGCOverheadLimit para
disabilitar)
• Depreciado no Java 9
• Retirado de vez no Java 14.
41. G1 Garbage Collector
• G1 (Garbage First) Garbage Collector foi projetado para aplicativos
executados em máquinas multiprocessadas com grande espaço de
memória.
• Está disponível desde a atualização 4 do JDK7 e em versões posteriores.
• Substituto do CMS.
• O coletor G1 particiona o heap em um conjunto de sub-regiões de heap
de mesmo tamanho, cada uma com um intervalo contíguo de memória
virtual.
42.
43. CMS x G1
• Foco inicial do G1 é fornecer uma solução para Apps que exigem
grandes heaps com latência de GC limitada.
• Isso significa tamanhos de heap de cerca de 6 GB ou mais, e tempo de
pausa estável e previsível abaixo de 0,5 segundos.
• Padrão a partir do JDK 9.
44.
45. Load Average
Em resumo, estes são os valores médios dos processos esperando
execução ou em execução nos últimos períodos de 1, 5 e 15 minutos.
46. Load Average
regra simples:
LA >> que o número de CPUs está provavelmente bem ocupado, ou
travado por algum gargalo ou falta de recurso crítico.
LA << mais baixo que o número de CPUs está provavelmente folgado.
58. JMX
• A Java Management Extensions (JMX) é uma API padrão para
gerenciamento e monitoramento de recursos tais como aplicações,
dispositivos, serviços e a máquina virtual Java (JVM).
• Foi desenvolvida através de um processo Java Community Process
(JCP) que envolveu a JSR-003 (Java Management Extensions) e a JSR-
160 (JMX Remote API).