#Imergindo na JVM
Otávio Santana
@otaviojava
http://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 7
1) JSR 203 : ("NIO.2")
2) JSR 292 : Invoke Dynamic
3) JSR 334 :COIN
JEP 174: Nashorn JavaScript Engine
JEP 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 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
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
•
Primitivos
Nome 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 short
Z boolean
[ referência de um vetor
[[ referência de uma matriz
double dobro(double d) =(D)D
Double dobro(Double d) =(Ljava/lang/Double;)Ljava/lang/Double
void processar(Object o)(Ljava/lang/Object;)V
Int 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
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-core
Objetos com Muito tempo de vida
Similar 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 Source
Faça Parte você também
Comece 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 Nativo
Legal para conhecer melhor sobre o
funcionamento( GC, Alocação de memória, IO)
Código Legal em outras linguagens
Comunicar com outras Plataformas
JNI
Tipo 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 HelloWorld
gcc -o libHelloWorld.so -shared -I$JAVA_HOME/include
-I$JAVA_HOME/linux HelloWorld.c
java -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
@otaviojava
http://www.java.net/blogs/otaviojava/
http://otaviosantana.blogspot.com.br/

Imergindo jvm[Apresentação ]

  • 1.
    #Imergindo na JVM OtávioSantana @otaviojava http://www.java.net/blogs/otaviojava/ http://otaviosantana.blogspot.com.br/
  • 2.
  • 3.
    Sumário ● Falar dalinguagem Java ● Histórico das versões ● Linguagens da JVM ● Tipo de valores para a JVM ● Registradores ● Bytecodes ● Gargage Collector
  • 4.
    ➢ Uma daslinguagens mais usadas no mundo ➢ Uma comunidade muito forte ➢ Recolhe memória de modo automático ➢ Multi-plataforma ➢ Linguagem ➢ Plataforma ➢ Máquina virtual
  • 5.
    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 Engine JEP 156: G1 GC: Reduce need for full GCs
  • 6.
    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
  • 7.
    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
  • 8.
    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
  • 9.
    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
  • 10.
    Linguagem, Plataforma, JVM •Linguagem: if, do, while,Object, herança • JSE ( NIO, Collections) • JVM (Multiplataforma, GC)
  • 12.
  • 14.
  • 15.
    Primitivos Nome Tamanho variaçãoValor 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
  • 16.
    Registradores • Heap: instâncias •Method Area: classes • Pilha Java: métodos java • Pilha navita: pilhas nativas • PC Counter: execução
  • 18.
    PC e PilhaNavita • PC • Pilha Nativa
  • 19.
    Pilhas Java • Definidano tempo de compilação • Unidade 32 bits • Byte, short, chart para int
  • 20.
    Operação e variável • publicint doInscante(int a, double b); • public static int doClass(int a, double b);
  • 21.
    Operação e variável • publicint doInscante(int a, int b); • DoInstance(10,20);
  • 22.
    Operação e variável • publicdouble doInscante(double a, double b); • DoInstance(10.10d,20.20);
  • 23.
    MethodArea • O qualifiedda 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)
  • 24.
    Code Cache • CódigoCompilado 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
  • 25.
    Estrutura de umaclasse • Magic: #CAFEBABE • Menor e maior
  • 26.
    Estrutura de umaClasse ➢ 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
  • 27.
    Estrutura de umaClasse ● 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”
  • 28.
    Estrutura de umaClasse ● 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”
  • 29.
    Constant Pool ● Métodos ● Atributos ● Índice eum vetor B byte signed byte C char D double F float I int J long L Classname ; referência S short Z boolean [ referência de um vetor [[ referência de uma matriz double dobro(double d) =(D)D Double dobro(Double d) =(Ljava/lang/Double;)Ljava/lang/Double void processar(Object o)(Ljava/lang/Object;)V Int somar(int a, float f);=(IF)I
  • 30.
    Byte Codes ● Byte açãoou 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
  • 31.
    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
  • 32.
    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
  • 33.
  • 34.
    Heap Instâncias Gerenciamento de memória Poolde objetos Informações da classe representação do array=n*[referência
  • 35.
    Criar Objetos Carregar oarquivo 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
  • 36.
    Class Loarder ✔Bootstrap- linguagem(código confiável) ✔Extension – plataforma ✔System – da aplicação ✔Usuario – a gosto do freguês (servidores)
  • 37.
    Garbage Collector ✔Coletor deLixo ✔Mark Sweep ✔Alto tempo ✔Maior collector
  • 38.
    Garbage Collector ✔Objetos nãoduram ✔Alocado logicamente, mas não fisicamente ✔Copiados por gerações ✔Minor collector
  • 39.
  • 40.
  • 41.
    Concorrente ✔MultiCore ✔Objetos com Muitotempo de vida ✔Minimiza o tempo de pausa ✔Menores Pausas com Maior frequência
  • 42.
    Concorrente Incremental Multi-core Objetos comMuito tempo de vida Similar ao anterior Tempo definido no processador
  • 43.
    G1 ✔MultiCore ✔Grande Volume deMemó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
  • 44.
    OpenJDK Projeto Open Source FaçaParte você também Comece usando
  • 45.
    OpenJDK . (root) configuraçõescomuns 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
  • 46.
    JNI Interface entre ocódigo Java e o Nativo Legal para conhecer melhor sobre o funcionamento( GC, Alocação de memória, IO) Código Legal em outras linguagens Comunicar com outras Plataformas
  • 47.
    JNI Tipo em JavaTipo 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 HelloWorld gcc -o libHelloWorld.so -shared -I$JAVA_HOME/include -I$JAVA_HOME/linux HelloWorld.c java -Djava.library.path=. HelloWorld Otávio 4
  • 48.
    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
  • 49.
  • 50.