Imergindo jvm[Apresentação ]

Preview:

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

#Imergindo na JVM

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

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● Gargage Collector

➢ 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

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

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

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

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

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

Linguagem, Plataforma, JVM

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

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

Class.class Stream

Instruções

Execução Nativa

tipos

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

Registradores

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

PC e Pilha Navita

• PC• Pilha Nativa

Pilhas Java

• Definida no tempo de compilação

• Unidade 32 bits• Byte, short, chart para

int

Operação e variável

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

Operação e variável

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

Operação e variável

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

• DoInstance(10.10d,20.20);

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

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”

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ânciasGerenciamento de memóriaPool de objetosInformações da classerepresentação do array=n*[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

Class Loarder

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

Garbage Collector

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

Garbage Collector

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

Serial

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

Paralelo

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

Concorrente

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

Concorrente Incremental

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

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

OpenJDK

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

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

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

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

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: sympa@javali.java.net com assunto: lista de discussão openjdk

E-Book

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

#Obrigado

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