imergindo jvm[apresentação ]
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.TRANSCRIPT
#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: [email protected] 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/