50
#Imergindo na JVM Otávio Santana @otaviojava http://www.java.net/blogs/otaviojava/ http://otaviosantana.blogspot.com.br/

Imergindo jvm[Apresentação ]

Embed Size (px)

DESCRIPTION

Certamente o Java é atualmente uma das linguagens mais usadas e uma das mais populares no mundo, sendo que os seus maiores diferenciais não estão na linguagem e sim na JVM (Máquina virtual Java). Conheça um pouco mais sobre esse motor, seu funcionamento e sua arquitetura para tirar melhor proveito dela em suas aplicações, além de conhecer um pouco sobre a implementação de referência e open source da JVM, o OpenJDK.

Citation preview

Page 1: Imergindo jvm[Apresentação ]

#Imergindo na JVM

Otávio Santana@otaviojavahttp://www.java.net/blogs/otaviojava/http://otaviosantana.blogspot.com.br/

Page 2: Imergindo jvm[Apresentação ]

Comunidades

• @javabahia• @soujava• @java• @soujavalivre

Page 3: Imergindo jvm[Apresentação ]

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

Page 4: Imergindo jvm[Apresentação ]

➢ 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

Page 5: Imergindo jvm[Apresentação ]

Funcionamento externo

• JCP (Java Community Process)• JSR(Java Specification Requests)• JEP (JDK Enhancement Proposals)

• JSR 336 = Java 71) 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: Imergindo jvm[Apresentação ]

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 AWTInner classes, JavaBeans, JDBC , RMI Reflection

Page 7: Imergindo jvm[Apresentação ]

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 8: Imergindo jvm[Apresentação ]

Histórico da Plataforma

• 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

Page 9: Imergindo jvm[Apresentação ]

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

Page 10: Imergindo jvm[Apresentação ]

Linguagem, Plataforma, JVM

• Linguagem: if, do, while,Object, herança

• JSE ( NIO, Collections)• JVM (Multiplataforma, GC)

Page 11: Imergindo jvm[Apresentação ]
Page 12: Imergindo jvm[Apresentação ]

Class.class Stream

Instruções

Execução Nativa

Page 13: Imergindo jvm[Apresentação ]
Page 14: Imergindo jvm[Apresentação ]

tipos

Page 15: Imergindo jvm[Apresentação ]

PrimitivosNome Tamanho variação Valor padrão Tipo

byte 8-bit -2⁷ até 2⁷ 0 inteiro

short 16-bits -2¹ até 2¹⁵ ⁵ 0 inteiro

integer 32-bits -2³² até 2³¹ 0 inteiro

long 64-bits -2 ³ até 2 ³⁶ ⁶ 0 inteiro

char 16-bits UFT-8 '\u0000' inteiro

Float 32-bits 0 flutuante

Double 64-bits 0 flutuante

boolean inteiro false booleano

returnAddress nulo ponteiro

Page 16: Imergindo jvm[Apresentação ]

Registradores

• Heap: instâncias• Method Area: classes • Pilha Java: métodos java• Pilha navita: pilhas nativas• PC Counter: execução

Page 17: Imergindo jvm[Apresentação ]
Page 18: Imergindo jvm[Apresentação ]

PC e Pilha Navita

• PC• Pilha Nativa

Page 19: Imergindo jvm[Apresentação ]

Pilhas Java

• Definida no tempo de compilação

• Unidade 32 bits• Byte, short, chart para

int

Page 20: Imergindo jvm[Apresentação ]

Operação e variável

• public int doInscante(int a, double b);• public static int doClass(int a, double b);

Page 21: Imergindo jvm[Apresentação ]

Operação e variável

• public int doInscante(int a, int b);• DoInstance(10,20);

Page 22: Imergindo jvm[Apresentação ]

Operação e variável

• public double doInscante(double a, double b);

• DoInstance(10.10d,20.20);

Page 23: Imergindo jvm[Apresentação ]

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 24: Imergindo jvm[Apresentação ]

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 25: Imergindo jvm[Apresentação ]

Estrutura de uma classe

• Magic: #CAFEBABE• Menor e maior

Page 26: Imergindo jvm[Apresentação ]

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

Page 27: Imergindo jvm[Apresentação ]

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 28: Imergindo jvm[Apresentação ]

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 29: Imergindo jvm[Apresentação ]

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 30: Imergindo jvm[Apresentação ]

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 31: Imergindo jvm[Apresentação ]

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 32: Imergindo jvm[Apresentação ]

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 33: Imergindo jvm[Apresentação ]

Demos

Page 34: Imergindo jvm[Apresentação ]

Heap

InstânciasGerenciamento de memóriaPool de objetosInformações da classerepresentação do array=n*[referência

Page 35: Imergindo jvm[Apresentação ]

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

Page 36: Imergindo jvm[Apresentação ]

Class Loarder

✔Bootstrap- linguagem (código confiável)✔Extension – plataforma✔System – da aplicação✔Usuario – a gosto do freguês (servidores)

Page 37: Imergindo jvm[Apresentação ]

Garbage Collector

✔Coletor de Lixo✔Mark Sweep✔Alto tempo✔Maior collector

Page 38: Imergindo jvm[Apresentação ]

Garbage Collector

✔Objetos não duram✔Alocado logicamente, mas não fisicamente✔Copiados por gerações✔Minor collector

Page 39: Imergindo jvm[Apresentação ]

Serial

✔Monocore✔Pequenos dispositivos✔Pequenas aplicações✔Multi-core com pequena memória

Page 40: Imergindo jvm[Apresentação ]

Paralelo

✔MultiCore✔Aplicações com Objetos com pouco tempo de Vida

Page 41: Imergindo jvm[Apresentação ]

Concorrente

✔MultiCore✔Objetos com Muito tempo de vida✔Minimiza o tempo de pausa✔Menores Pausas com Maior frequência

Page 42: Imergindo jvm[Apresentação ]

Concorrente Incremental

Multi-coreObjetos com Muito tempo de vidaSimilar ao anterior Tempo definido no processador

Page 43: Imergindo jvm[Apresentação ]

G1

✔MultiCore✔Grande Volume de Memória✔Calculo de Objetos vivos✔Cópia para o espaço em Branco✔O que ficou é espaço Vazio✔Prioriza espaço com menor Objetos vivos

Page 44: Imergindo jvm[Apresentação ]

OpenJDK

Projeto Open SourceFaça Parte você tambémComece usando

Page 45: Imergindo jvm[Apresentação ]

OpenJDK. (root) configurações comuns para compilar a OpenJDK

hotspot o código fonte para construir o OpenJDK (baseado no fonte do hotspot) Nesse projeto é encontrado as implementações do GC

langtools o código fonte para o compilador e utilitários para a linguagem

jdk o código fonte da plataforma JSE, por exemplo, java.lang.String, java.lang.Object, etc.

jaxp o projeto JAXP

jaxws o projeto JAX-WS

corba o projeto Corba

nashorn o projeto nashorn

Código Específico para o SO Códigos comuns ficam em Share

Page 46: Imergindo jvm[Apresentação ]

JNI

Interface entre o código Java e o NativoLegal para conhecer melhor sobre o

funcionamento( GC, Alocação de memória, IO)Código Legal em outras linguagensComunicar com outras Plataformas

Page 47: Imergindo jvm[Apresentação ]

JNITipo em Java Tipo Nativo

boolean jboolean

byte jbyte

char jchar

double jdouble

float jfloat

int jint

long jlong

short jshort

void void

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386/javac HelloWorld.java javah -jni HelloWorldgcc -o libHelloWorld.so -shared -I$JAVA_HOME/include

-I$JAVA_HOME/linux HelloWorld.cjava -Djava.library.path=. HelloWorld Otávio 4

Page 48: Imergindo jvm[Apresentação ]

SouJavaLivre

• Blog:http://soujavalivre.blogspot.com.br/• Twitter: @soujavalivre• Página no facebook: soujavalivre• Lista de discussão:• http://java.net/projects/javali/lists/openjdk• Envie um e-mail

para: [email protected] com assunto: lista de discussão openjdk

Page 49: Imergindo jvm[Apresentação ]

E-Book

http://www.slideshare.net/otagonsan/imergindo-na-jvm

Page 50: Imergindo jvm[Apresentação ]

#Obrigado

Otávio Santana@otaviojavahttp://www.java.net/blogs/otaviojava/http://otaviosantana.blogspot.com.br/