Upload
otavio-goncalves-de-santana
View
340
Download
0
Embed Size (px)
DESCRIPTION
Um do maiores diferenciais do Java não está na linguagem e sim na JVM. Conheça um pouco mais sobre esse “motor”, seu funcionamento e sua arquitetura para tirar melhor proveito da JVM em suas aplicações.
Citation preview
JVM Internal
Otávio Santana @otaviojava
Comunidades
● @javabahia● @soujava● @java● @soujavalivre
Sumário
● Falar da linguagem Java● Histórico das versões ● Linguagens da JVM● Tipo de valores para a JVM● Registradores● Bytecodes
➢ Uma das linguagens mais usadas no mundo➢ Uma comunidade muito forte
➢ Recolhe memória de modo automático➢ Multi-plataforma
➢ Linguagem ➢ Plataforma➢ Máquina virtual
Java
Funcionamento Externo
● JCP (Java Community Process)
● JSR(Java Specification Requests)
● JEP (JDK Enhancement Proposals)
● JSR 336 = Java 7
1) JSR 203 : ("NIO.2")
2) JSR 292 : Invoke Dynamic
3) JSR 334 :COIN
JEP 174: Nashorn JavaScript EngineJEP 156: G1 GC: Reduce need for full GCs
OpenJDK
hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk_1_9sh ./get_source.sh./configuremake install
Empresas
AMDApple
Azul Systems, Inc.CanonicalGoogle
IBMIntel
OracleRedHat
SAP Software Company StratusTwitter
Histórico da Plataforma
● Em 1995 foram lançadas betas do Java
● 1.0 em janeiro de 1996 foi a primeira versão estável
● Na 1.1 lançada em fevereiro de 1997
● Grande melhorias no evento do AWT
● Inner classes, JavaBeans, JDBC , RMI
● Reflection
Histórico da Plataforma
● No Java 1.2 de dezembro de 1998
● palavra-chave strictfp, Swing, JIT, Java Plug-in
● Java IDL,Collections framework
● No java 1.3 em maio de 2000
● JavaSound, Java Naming and Directory Interface (JNDI)
Java Platform Debugger Architecture (ACDP)
Kestrel
● No Java 1.4 fevereiro de 2002
● Primeira com o JCP, NIO, XML, JDBC 3.0, API de Loggin, assert, expressões regulares
● No java 1.5 setembro de 2004
● Generics, Autoboxing/Unboxing, Varargs, Annotations
Merlin
Histórico da Plataforma
● No Java 1.6 dezembro de 2006
● JDBC 4.0, Rhino, Java Compiler API, API WebServices
● No Java 1.7 julho de 2011
● NIO2, OpenJDK referência, Diamond, Coin
Histórico da Plataforma
● No Java 1.8 dezembro de 2006
● Lambda, Stream, Nashorn
● No Java 1.9 julho de 2016
● Cloud, MoneyAPI, Sumatra, JavaFX
Histórico da Plataforma
Linguagem, Plataforma, JVM
● Linguagem: if, do, while,Object, herança● JSE ( NIO, Collections)● JVM (Multiplataforma, GC)
Java Program
JVMJVM JVMJVM JVMJVM JVMJVM
JVM
JVM
JavaC/C++XMLOutras
JVM
2008 2009 2010 2011 2012 2013 20140
0.5
1
1.5
2
2.5
3
3.5
4
JavaC/C++Outras
JVM
HHOOTTSSPPOOTT
JROCKIT
OPENJDK
JVM
Tipos
Primitivos
Referência
numéricos
booleano
returnAdress
flutuante
inteiro
float
double
chart
short
int
byte
long
classe
interface
Array
PrimitivosNome Size variação default Tipobyte 8 -2 até 2⁷ ⁷ 0 inteiro
short 16 -2¹ até 2¹⁵ ⁵ 0 inteiro
integer 32 -2³² até 2³¹ 0 inteiro
long 64 -2 ³ até 2 ³⁶ ⁶ 0 inteiro
char 16 UFT-8 '\u0000' inteiro
Float 32 0 flutuante
Double 64 byte 0 flutuante
boolean int false booleano
returnAddress nulo ponteiro
Registradores
● Heap: instâncias
● Method Area: classes
● Pilha Java: métodos java
● Pilha navita: pilhas nativas
● PC Counter: execução
HeapHeap Method AreaMethod Area Pilha JavaPilha Java Pilhas Nativas
Pilhas Nativas PC counterPC counter
heapheap
Pilha Java
PC Counter
Pilha Nativa
Thread 1
Pilha Java
PC Counter
Pilha Nativa
Thread 2
Pilha Java
PC Counter
Pilha Nativa
Thread 3
Method AreaMethod Area
ObjetoObjeto ObjetoObjeto
ObjetoObjeto
ObjetoObjeto ObjetoObjeto ObjetoObjeto
ObjetoObjeto
ObjetoObjeto
classclass classclass
classclassclassclass
Registradores em Thread
PC e Pilha Navita
● PC
● Pilha Nativa
Pilhas Nativas
Pilhas Nativas
PCPC
returnAdressreturnAdress
??? ? ?? ? ?
? ? ?
??
Pilhas Java
● Definida no tempo de compilação
● Unidade 32 bits
● Byte, short, chart para int
Pilhas JavaPilhas Java
Frame
PilhaDe
Operações
Pilha De
Variáveis
Frame Data
Frame
PilhaDe
Operações
Pilha De
Variáveis
Frame Data
Operação e variável
● public int doInscante(int a, double b);
● public static int doClass(int a, double b);
Pilha de variáveisPilha de variáveis
referência
int
double
Pilha de variáveisPilha de variáveis
int
double
● public int doInscante(int a, int b);
● DoInstance(10,20);
Pilha de operaçõesPilha de operações
10
Pilha de operaçõesPilha de operações
10
20
Pilha de operaçõesPilha de operações
30
Operação e variável
Operação e variável
● public double doInscante(double a, double b);
● DoInstance(10.10d,20.20);
Pilha de operaçõesPilha de operações
10
Pilha de operaçõesPilha de operações
10.10
Pilha de operaçõesPilha de operações
10.10
20.20
Pilha de operaçõesPilha de operações
30.30
MethodArea
● O qualified da classe
● O qualified da classe pai
● Informação se é uma classe ou interface
● Os modificadores
● A lista com os qualifieds das interfaces
● Constant Pool (informações dos métodos, atributos, referência da classe, referência da ClassLoader)
Code Cache
● Código Compilado pelo JIT● Just In TIME (Deixa o código
mais rápido em tempo de execução o tranformando em nativo)
● Junto com o Heap
Estrutura de uma classe
● Magic: #CAFEBABE
● Menor e maior
Estrutura de uma Classe
➢ JDK 1.0 -> major version 45 e minor version 3
➢ JDK 1.1 -> major version 45 e minor version 3
➢ JDK 1.2 -> major version 46 e minor version 0
➢ JDK 1.3 -> major version 47 e minor version 0
➢ JDK 1.4 -> major version 48 e minor version 0
➢ JDK 1.5 -> major version 49 e minor version 0
➢ JDK 1.6 -> major version 50 e minor version 0
➢ JDK 1.7 -> major version 51 e minor version 0
➢ JDK 1.8 -> major version 52 e minor version 0
➢ JDK 1.9 -> major version 52 e minor version 0
Estrutura de uma Classe● ACC_PUBLIC - flag método, atributo públicos
● ACC_PRIVATE - flag para para privados
● ACC_PROTECTED - protected
● ACC_STATIC - stático
● ACC_FINAL - final
● ACC_SYNCHRONIZED - indica um método sincronizado
● ACC_BRIDGE - indica que o método foi gerado pelo compilador
● ACC_VARARGS - indica que é varags
● ACC_NATIVE - nativo
● ACC_ABSTRACT - abstrato
● ACC_STRICT - indica que o método é strict
● ACC_SYNTHETIC - indica que o método não é “original”
Constant Pool
●Métodos
●Atributos
●Índice e um vetor
B byte signed byte C char D double F float I int J long L Classname ; referência S shortZ boolean [ referência de um vetor [[ referência de uma matriz
double dobro(double d) =(D)DDouble dobro(Double d) =(Ljava/lang/Double;)Ljava/lang/Doublevoid processar(Object o)(Ljava/lang/Object;)VInt somar(int a, float f);=(IF)I
Byte Codes
●Byte ação ou operação
●Tipos específicos
●Byte, short, chart para int
✔ i para inteiro✔ l para long✔ s para short✔ b para byte✔ c para char✔ f para float✔ d para double✔ a para referência
Byte Codes✔ adicionar: iadd, ladd, fadd, dadd.✔ subtrair: isub, lsub, fsub, dsub.✔ multiplicar: imul, lmul, fmul, dmul.✔ divisão: idiv, ldiv, fdiv, ddiv.✔ resto: irem, lrem, frem, drem.✔ negação: ineg, lneg, fneg, dneg.✔ deslocar: ishl, sidh, iushr, lshl, lshr, lushr.✔ bit a bit 'or': ior, lor.✔ bit a bit 'and': iand, a terra.✔ bit a bit ou exclusivo: ixor, lxor.✔ Variável local incremente: iinc. ✔ Comparação: dcmpg, dcmpl, fcmpg, fcmpl, lcmp.✔ Conversão(promoção): i2l, i2f, i2d, l2f, l2d, e f2d ✔ Conversão (encurtar): i2b, i2c, i2s, l2i, f2i, f2l, d2i,d2l, e d2f
Byte Codes
✔ invokevirtual - chama um método de uma instância✔ invokeinterface -chama um método de uma interface✔ invokespecial -chamada de um método privado ou da super classe✔ invokestatic -realiza a chamada de um método estático✔ invokedynamic - método que constrói um objeto ✔ ireturn,lreturn, freturn, dreturn e areturn - retorno ✔ athrow -exceção ✔ monitorenter e monitorexit - sincronizados
Demos
Heap
●Instâncias●Gerenciamento de memória●Pool de objetos●Informações da classe●representação do array=n*[referência
heapheap
Objeto
Referência
referência
ObjetoPool
methodArea
Pool de Objetos
Heap
● Instâncias● Gerenciamento de memória● Pool de objetos● Informações da classe● representação do array=n*[referência
Classe
Referência
Tamanho
Classe
Referência
Tamanho
Classe
Referência
Tamanho
Classe
Tamanho
Classe
Referência
Tamanho
Classe
Tamanho
Referência
Criar Objetos
✔ Carregar o arquivo para a JVM✔ Implementa a interface java.lang.Class ✔ ClassLoader: boot-strap, não-definido✔ Linkar: verificar código de segurança, estrutura✔ Chamar o método construtor
Linkar
Objeto
Classe.classClassLoader
Class
methodArea
JVM
Carregar
Class Loarder
✔ Bootstrap- linguagem (código confiável)✔ Extension – plataforma✔ System – da aplicação✔ Usuario – a gosto do freguês (servidores)
Bootstrap Class Loader
Extension Class Loader
System Class Loader
Usuário Class Loaders
Usuário Class Loaders
Usuário Class Loaders
Usuário Class Loaders
Java 9
Reflections wrappers Regex Security Core0
50
100
150
200
250
Java 8 - ProcessJava 9 -ProcessJava 8 - MemoryJava 9 -Memory
Shenandoah
● Gerenciar um número maior de memória● 100GG● 8 cores
Melhorias no GC
● Remove combinações depreciadas● Strings Deduplication● Segmented Code Cache● Shenandoah
8 1 5
2 20 10
5 12 4
10 2
8 1 1 5
2 20 10
5 4 12
10 4 2
Strings duplication
● 25% do Heap é Strings● 13.5% String duplicadas
75
25
Heap
Another objects String
85
15
String inside Heap
String Strings duplicates
Segmented Code Cache
● JVM internal (non-method) code● Profiled-code● Non-profiled code
Novidades
● Escrita/leitura leva para JSON● Generics para primitives● builders para Collections● Literal para Collections● Process API Updates● Smart Java Compilation● http 2.0 cliente
Novidades
● List<String> list = List.of(a, b, c);● Set<String> set = Set.of(d, e, f, g);● Map<String,String> map =
Map.of(k1, V1);//not collection● List<Integer> list = #[ 1, 2, 3 ];
Money Api
● Cuida do dinehiro● Formata● Arredondamento● Cotações
Measurement API
● Unidade de medida● Padroniza● Formata● Operações (convert, add, subtract)
Thank you
Otávio Santana @otaviojava