53
JVM Internal Otávio Santana @otaviojava

Jsummit 2014

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

Page 1: Jsummit 2014

JVM Internal

Otávio Santana @otaviojava

Page 2: Jsummit 2014

Comunidades

● @javabahia● @soujava● @java● @soujavalivre

Page 3: Jsummit 2014

Sumário

● Falar da linguagem Java● Histórico das versões ● Linguagens da JVM● Tipo de valores para a JVM● Registradores● Bytecodes

Page 4: Jsummit 2014

➢ 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

Page 5: Jsummit 2014

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

Page 6: Jsummit 2014

OpenJDK

hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk_1_9sh ./get_source.sh./configuremake install

Page 7: Jsummit 2014

Empresas

AMDApple

Azul Systems, Inc.CanonicalGoogle

IBMIntel

OracleRedHat

SAP Software Company StratusTwitter

Page 8: Jsummit 2014

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

Page 9: Jsummit 2014

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

Page 10: Jsummit 2014

● 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

Page 11: Jsummit 2014

● 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

Page 12: Jsummit 2014

● 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

Page 13: Jsummit 2014

Linguagem, Plataforma, JVM

● Linguagem: if, do, while,Object, herança● JSE ( NIO, Collections)● JVM (Multiplataforma, GC)

Page 14: Jsummit 2014

Java Program

JVMJVM JVMJVM JVMJVM JVMJVM

JVM

Page 15: Jsummit 2014
Page 16: Jsummit 2014

JVM

JavaC/C++XMLOutras

Page 17: Jsummit 2014

JVM

2008 2009 2010 2011 2012 2013 20140

0.5

1

1.5

2

2.5

3

3.5

4

JavaC/C++Outras

Page 18: Jsummit 2014

JVM

HHOOTTSSPPOOTT

JROCKIT

OPENJDK

Page 19: Jsummit 2014

JVM

Page 20: Jsummit 2014

Tipos

Primitivos

Referência

numéricos

booleano

returnAdress

flutuante

inteiro

float

double

chart

short

int

byte

long

classe

interface

Array

Page 21: Jsummit 2014

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

Page 22: Jsummit 2014

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

Page 23: Jsummit 2014

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

Page 24: Jsummit 2014

PC e Pilha Navita

● PC

● Pilha Nativa

Pilhas Nativas

Pilhas Nativas

PCPC

returnAdressreturnAdress

??? ? ?? ? ?

? ? ?

??

Page 25: Jsummit 2014

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

Page 26: Jsummit 2014

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

Page 27: Jsummit 2014

● 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

Page 28: Jsummit 2014

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

Page 29: Jsummit 2014

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)

Page 30: Jsummit 2014

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

Page 31: Jsummit 2014

Estrutura de uma classe

● Magic: #CAFEBABE

● Menor e maior

Page 32: Jsummit 2014

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

Page 33: Jsummit 2014

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”

Page 34: Jsummit 2014

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

Page 35: Jsummit 2014

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

Page 36: Jsummit 2014

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

Page 37: Jsummit 2014

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

Page 38: Jsummit 2014

Demos

Page 39: Jsummit 2014

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

Page 40: Jsummit 2014

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

Page 41: Jsummit 2014

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

Page 42: Jsummit 2014

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

Page 43: Jsummit 2014

Java 9

● Build: 34● https://jdk9.java.net/download/● Java 8 rápido

Page 44: Jsummit 2014

Java 9

Reflections wrappers Regex Security Core0

50

100

150

200

250

Java 8 - ProcessJava 9 -ProcessJava 8 - MemoryJava 9 -Memory

Page 45: Jsummit 2014

Shenandoah

● Gerenciar um número maior de memória● 100GG● 8 cores

Page 46: Jsummit 2014

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

Page 47: Jsummit 2014

Strings duplication

● 25% do Heap é Strings● 13.5% String duplicadas

75

25

Heap

Another objects String

85

15

String inside Heap

String Strings duplicates

Page 48: Jsummit 2014

Segmented Code Cache

● JVM internal (non-method) code● Profiled-code● Non-profiled code

Page 49: Jsummit 2014

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

Page 50: Jsummit 2014

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 ];

Page 51: Jsummit 2014

Money Api

● Cuida do dinehiro● Formata● Arredondamento● Cotações

Page 52: Jsummit 2014

Measurement API

● Unidade de medida● Padroniza● Formata● Operações (convert, add, subtract)

Page 53: Jsummit 2014

Thank you

Otávio Santana @otaviojava