60

Imergindo Na Jvm

Embed Size (px)

DESCRIPTION

imersão na java virtual machine

Citation preview

  • 1. Introduction2. Crdito3. SobreoAutor4. FalandoumpoucosobreJVM5. Sequerespreverofuturo,estudaopassado

    i. HistricodaJVMi. JDKAlphaeBeta(1995)ii. JDK1.1(19defevereirode1997)iii. J2SE1.2(8dedezembrode1998)iv. J2SE1.3(8demaiode2000)v. J2SE1.4(6defevereirode2002)vi. J2SE5.0(30desetembrode2004)vii. JavaSE6(11dedezembrode2006)viii. JavaSE7(28dejulhode2011)ix. JavaSE8(18demarode2014)

    6. FuncionamentobsicodaJVM7. RegistradoresdaJVM

    i. ProgramCounterii. JavaStack(Javavirtualmachinestack)

    i. StackFrame)i. Stackvariablesii. StackOperandiii. FrameData

    iii. NativeMethodStacksiv. MethodAreav. HeapSpacevi. Cachedecdigo

    i. JustInTime(JIT)Compilationvii. Recapitulando

    8. ByteCodesi. Carregaresalvarinformaesii. Operaesaritmticasiii. Conversodevaloresiv. Criaoemanipulaodeobjetosv. Instruescondicionaisvi. Chamadademtodoseretornodevaloresvii. Classesapscompilao

    9. Ciclodevidadeumaclasse10. GarbageCollector

    i. ImplementaoSerialii. ImplementaoParaleloiii. ImplementaoConcurrentiv. ImplementaoIncrementalConcurrentv. ImplementaoGarbageFirst

    11. InterfaceNativaJava12. OprojetoOpenJDK

    Tabeladecontedos

    ImergindonaJVM

    2

  • CertamenteoJavaatualmenteumadaslinguagensmaisusadaseumadasmaispopularesnomundo,sendoqueoseumaiordiferencialnoestnalinguagemesimnaJVM(MquinavirtualJava).Conheaumpoucomaissobreessemotor,seufuncionamentoesuaarquiteturaparatirarmelhorproveitodelaemsuasaplicaes,almdeconhecerumpoucosobreaimplementaoderefernciaeopensourcedaJVM,oOpenJDK.OcontedodesseE-bookfalarsobre:

    OsregistradoresdaJVMAinterfacedoJavacomcdigonativo,JNI,presenteemdiversospontosdoJVM,dentreeles,oNIOeGargabeCollector,OfuncionamentobsicodoGarbageCollectorComocompilaroOpenJDKByteCodeeoseufuncionamentoEmuitomais!

    ImergindonaJVM

    ImergindonaJVM

    3Introduction

  • RaulLibriodoopenSUSEProject,ondeatuanareadewiki,artwork,criaodeartigosetraduo.TemasmotoscomopaixoeMuayThaicomoesporte.

    WeslleyAndradeServodeJesus,amantedaartedeprogramar,adeptododesenvolvimentopoliglota,movimentoDevOpsecoordenadordogrupoFTD(friendstechday.com)

    ArtedacapadoEbook

    Revisodotexto

    ImergindonaJVM

    4Crdito

  • UmDesenvolvedorapaixonadopeloquefaz.PraticantedafilosofiagiledodesenvolvimentopoliglotanaBahia,JUGLeaderdoJavaBahia,coordenadordoSouJavaalmdeauxiliaremdiversosJUGsaoredordomundo,umdosfomentadoresdogrupoLingugil.LevaasriootermoMakethefutureJavapresentecomomembrodoJavaExpertGroupemdiversasespecificaesJavanasplataformasSE,MEeEE,principalmentenaSEemquecontribuidiretamenteparaoprojetoOpenJDK,almdesermembroatuantedoJCP,inclusiveganhandoumoutstandingmemberawardeJavaChampionpelosseusfeitos.PresentenosmaioreseventosJavaedesenvolvimentodesoftwaredomundo.ContribuiuparadiversosprojetosOpenSourcetambmmembrodaOSI,OpenSourceInstituite,desenvolveerealizamanutenesnosprincipaisprojetosJavadaApacheFoundationnaqualatualmentecommiter.Quandosobratempo,escreveartigos,livroseajudarrevisotcnicadediversosmateriaisnomundoJava.

    Autor

    OtavioSantana

    ImergindonaJVM

    5SobreoAutor

  • CertamenteoJavaatualmenteumadaslinguagensmaisusadasepopularesnomundo,sendoqueoseumaiordiferencialnoestnalinguagemesimnaJVM,mquinavirtualJava.AJVMvemsendoalvodemuitosestudosepesquisas,afinalconhecerbemaJVMvaigarantiraodesenvolvedorJava,maneirasparatiraromelhorproveitodalinguagemedaplataformaalmdeprogramardemaneiramaiseficientelevandoemconsideraotudooqueaJVMpodefazerporeleeajudandoamesmaateajudar.Comesseobjetivoestoucriandoessepequenotexto,ajudaracomunidadebrasileiraaconheceraJVM.

    EssematerialfrutodosmeustrabalhosjuntocomoOpenJDK.AJVMopensourcee,apartirdaverso7,setornouaimplementaodereferncia.Aocontrriodoquemuitaspessoasimaginam,existemmilhesdemquinasvirtuais,dentreasmaispopularesestaHotSpot(tambmconhecidacomoaJVMdaOracle).OOpenJDKumprojetovivocomajudademuitasempresas(Oracle,Intel,RedHat,AMD,Google,etc.),masprincipalmentecomagrandeajudadacomunidade,quedentreasdiversasfrentesdetrabalhoqueexistempodemosdestacaroAdoteoOpenJDKquevisaaevoluodaplataformaedoJavaLivre(ajudandonarefatorao,evangelizandosobreoOpenJDK,identificandoecorrigindobugs).

    Parafacilitaroentendimentodoleitoressetrabalhofoidivididoemseispartes:

    AprimeirafalarumpoucosobreoJava,fazendoadevidaseparaoentrelinguagem,plataformaemquinavirtualalmdefalarumpoucosobreahistriadoJavaedasuaevoluojuntocomasverses.

    EmseguidasefalarsobreofuncionamentobsicodaJVM,faradistinobsicaentreoJavalinguagemedamquinavirtual,jquealtimaprecisasercompiladaparaquealinguagemsejamultiplataforma,ociclodevidadaJVMedosprocessosemparaleloquenascemcomumaaplicaoJava.

    SaberaondeficacadainformaodentrodaJVMeonomedosseusrespectivosregistradores.Seroalvodessaterceirapartedotrabalho.SaberquaisregistradoresserocompartilhadosportodasasThreadseaquelesquenosero,assimnascememorremcomasuarespectivaThread.

    Obytecode,alinguagemdaMquinavirtual,poucoexplicadosobreela,massograasaosseusopcodesqueaJVMmultiplataforma.NessaparteseverquodiferenteoseucdigoemJavaedoprodutogerado,obytecode,almdaestruturaqueaclasseadquireapsoprocessodecompilao.

    AJVMconsisteemumprocessobsicodepegarainformaodaclasse,gerarstreamparadentrodaJVM(Naturalmentenamemriaprincipal)eexecut-lootornandoemcdigonativo,esseprocessodecarregarumaclassefeitaemtempodeexecuo,ouseja,scarregadaaclasseXnomomentoemqueelaforchamada,nobastaestarapenasnoimport,casoessaclassetenhaumpaiouimplementeinterfaceselasserocarregadasantesdessaclasseX.Todaclassepossuiumciclodevidaeconheaumpoucomaissobreesteciclonapartenmerocinco.

    UmgrandediferencialdaJVMorecursodegerenciamentoautomticodamemria,esseprocessoconsistememmatarerecuperarmemriadeobjetosquenoestomaissendoutilizados,esseopapeldoGarbageCollector.Conheaumpoucomaissobreasimplementaeseemquaissituaeselassomaisaconselhadas.

    ParafinalizarserdemonstradaumavisoprticadoJNIedoprojetoOpenJDKalmdosconceitosdecompilaraJVM.

    FalandoumpoucosobreJVM

    ImergindonaJVM

    6FalandoumpoucosobreJVM

  • JVM,javavirtualmachineoumquinavirtualjava,temsuahistriainciadaem1992.OGreenProjectnapocaalinguagemeradenominadadeoak.Comopassardotempoamquinavirtualfoievoluindoeficandocadavezmaiscomplexa.AlinguagemJavapossuiumasintaxesimilaraoC++,orientadoaobjetosesetornoupopularemconjuntocomaweb.AJVMfuncionacomooalicercedaplataformaJavaficandoresponsvelportratartodasasplataformaseSistemasOperacionaisdemodoindependenteparaalinguagem.AJVMnoconheceabsolutamentenadadalinguagemJava,apenasoseubytecode,quevemnoformato.class,quesoasinstruesdaJVM(daapossibilidadedeportaroutraslinguagensparaaJVM,jqueelenorodaJavaesimobytecode).Esseclassocdigocompiladoerepresentaumaclasseouinterfaceemjava.

    DoseuincioatapresentedataoJavatevediversasverses.EssasmodificaessogerenciadaspeloJCPouJavaCommunityProcess(ocomitqueregeasmudanasdaplataformajavacomcercade30empresas),apartirdeJSRs(JavaSpecificationRequests),especificaesquefornecemtaismodificaesemelhorias.AdocumentaodalinguagemficanoJSL(JavaLanguageSpecification)eadocumentaodaJVMficanoJavaVirtualMachineSpecification.

    Sequerespreverofuturo,estudaopassado

    ImergindonaJVM

    7Sequerespreverofuturo,estudaopassado

  • AntesdesefalardosaspectosdoJava,comolinguagem,plataformaemquinavirtualinteressanteconhecerumpoucosobreaevoluoqueoJavavemsofrendo.Oprojetonasceuem1995eapartirdestadataveiosofrendoconstanteevoluocomajudadeempresasedacomunidade.

    HistricodaJVM

    ImergindonaJVM

    8HistricodaJVM

  • Nasversesalfasebetassetiveramumamquinainstvel.1.1.2-JDK1.0(23dejaneirode1996)

    ComocdigonomeOak,quetambmfoioprimeironomedalinguagem.Naverso1.0.2foilanadoaprimeiraversoestvel.

    JDKAlphaeBeta(1995)

    ImergindonaJVM

    9JDKAlphaeBeta(1995)

  • GrandesmelhoriaserefatoraesnosmodelosdeeventodoAWTInnerclassadicionadoalinguagemJavaBeansJDBCRMIReflectionquesuportavaapenasintrospeco,nenhumamodificaoemtemporealerapossvel.

    JDK1.1(19defevereirode1997)

    ImergindonaJVM

    10JDK1.1(19defevereirode1997)

  • ComocodinomePlaground.EssaeasoutrasversesforamdenominadasdeJava2,J2SEJava2Platform,StandardEdition,Houvemodificaessignificantesnessaversotriplicandoocdigopara1520classesem59pacotesincluindo:

    Apalavra-chavestrictfpAapidoSwingforamintegradosaoCoreAdicionandooJITcompiladorJavaPlug-inJavaIDL,umaimplementaoCORBAIDLparainteroperabilidadeCollectionsframework

    J2SE1.2(8dedezembrode1998)

    ImergindonaJVM

    11J2SE1.2(8dedezembrode1998)

  • ComocodinomeKestrel,asmodificaesmaisimportantesforam:

    HotSpotJVMincludo(aJVMHotSpotfoilanadoemabrilde1999paraos1,2J2SEJVM).RMIfoimodificadoparasuportaracompatibilidadeopcionalcomCORBAJavaSoundJavaNamingandDirectoryInterface(JNDI)includoembibliotecascentraisJavaPlatformDebuggerArchitecture(ACDP)Sintticosclassesdeproxy

    J2SE1.3(8demaiode2000)

    ImergindonaJVM

    12J2SE1.3(8demaiode2000)

  • ComocodinomeMerlin,foiaprimeiraversoparaaplataformadesenvolvidapeloJCPcomoaJSR59:

    Apalavra-chaveassert(JSR41)ExpressesregularesEncadeamentodeexceopermiteumaexceodemaiornvelencapsuleumaexceodemenornvel.SuporteaoProtocolodeinternetverso6(IPv6)ChamadasdeIO(chamadodeNIO)novosInput/Output(JSR51)APIdeloggin(JSR47)APIparalereescreverimagensinformatoscomoJPEDePNGIntegraocomoXMLeXSLT(JAXP)naJSR63Novasintegraescomextensesdeseguranaecriptografia(JCE,JSSE,JAAS).JavaWebStartincludo(JSR56).APIdepreferncias(java.util.prefs)

    J2SE1.4(6defevereirode2002)

    ImergindonaJVM

    13J2SE1.4(6defevereirode2002)

  • ComocodinomeTiger,foidesenvolvidanaJSR176,teveseufinaldevidaem8deabrilde2008eoencerramentodosuportedia3denovembrode2009.OTigeradicionousignificantesmelhoriasparaalinguagem:

    Generics:(JSR14).Annotations:(JSR175)Autoboxing/unboxing:Conversoautomticaentreostiposprimitivoseasclassesencapsuladas(JSR201).Enumerations:(JSR201.)Varargs:foreachloopCorreesparaoJavaMemoryModel(QuedefinecomoThreadsinteragematravsdamemria).StaticimportsGeraoautomticadostubparaobjetosRMINovolookandfeelparaoSwingchamadosynthUmpacoteutilitriodeconcorrncia(java.util.concurrent)AclasseScannerparaanalisardadosdeinputstreamsebuffers

    J2SE5.0(30desetembrode2004)

    ImergindonaJVM

    14J2SE5.0(30desetembrode2004)

  • ComocodinomeMustangue,nessaversoaSunsubstituionomeJ2SEeremoveuo.0donmerodaverso.EssaversofoidesenvolvidanaJSR270.

    SuportealinguagemdescriptJSR223):UmaAPIGenricaparaintegraocomlinguagensscriptsefoiembutidoaintegraocomoMozillaJavaScriptRhino.SuporteaWebServiceatravsdoJAX-WS(JSR224)JDBC4.0(JSR221).JavaCompilerAPI(JSR199):umaAPIparapermitirchamarcompilaoprogramandoJAXB2.0MelhoriasnoAnnotations(JSR269)MelhoriasnoGUI,comoSwingWorker,tabelafiltradaeordenadaMelhoriasnaJVMincluindo:sincronizaoeotimizaesdocompilador,Melhoriasnoalgorismodocoletordelixo.

    JavaSE6(11dedezembrode2006)

    ImergindonaJVM

    15JavaSE6(11dedezembrode2006)

  • ComocodinomeDolphinpossuiomaiornmerodeatualizaonoJava.Foilanadonodia7deJulhoefoidisponibilizadonodia28dejulhodomesmoano.

    DaVinciMachine:SuporteparalinguagensdinmicasProjetoCoinStringsinswitchAutomaticresourcemanagementintry-statementDiamondSimplifiedvarargsBinaryintegerliteralsNumericliteralsmult-tryNovopacoteutilitriodeconcorrncia:JSR166NIO2:novosbibliotecaparaIO

    JavaSE7(28dejulhode2011)

    ImergindonaJVM

    16JavaSE7(28dejulhode2011)

  • OJava8foientreguenodia18demarode2014enessaversofoiincludaalgunsrecursosqueantesestavamplanejadosparaoJava7.OsrecursossubmetidosparaessaversoforambaseadasempropostasdemelhoriasdoJDK,osJEPS.Dentreessasmelhoriaspodemosdestacar:

    JSR223,JEP174:ProjetoNashorn,umexecutorruntimedeJavaScript,permitindoaexecuodecdigoJavaScriptdentrodaaplicao.EsseprojetotevecomoobjetivoserosucessordoRhino,usandoInvokeDynamicemvezdereflection.JSR335,JEP126:SuporteparaexpresseslambdasJSR310,JEP150:DateandTimeAPIJEP122:RemoodoPermanentgeneration

    JavaSE8(18demarode2014)

    ImergindonaJVM

    17JavaSE8(18demarode2014)

  • EstecaptulofalarumpoucosobreofuncionamentobsicodaJVM,queocoraodalinguagemjava.Estaresponsvelpelaindependnciaentreasplataformaserodabasicamentedoistiposdeprocessos:

    OsescritoemjavaquesogeradosbytecodesOsnativosquesoescritasemlinguagenscomooC\C++elinkadasdinamicamenteparaumaplataformaespecfica.

    OsmtodosnativossomuitointeressantesparaobterinformaesdoSOondeaJVMestemexecuo,almdeutilizarrecursosdeste.EemfunodissoqueapesardealinguagemserRunAnyWhereaJVMno,ouseja,paracadaplataformaexisteumamquinavirtualespecfica.Issoacontece,porexemplo,parausarrecursosespecficosdaplataformaonde,porexemplo,existemchamadasdistintasparatrabalharcomdiretrioearquivos.

    OnicoeprincipalmotivodaJVMrodaroaplicativo.QuandoseiniciaumaexecuoaJVMnasceequandoaaplicaoterminaelamorre.criadoumaJVMparacadaaplicao,ouseja,seexecutartrsvezesomesmocdigoemumamesmamquinaseroiniciadas3JVMs.PararodarumaaplicaobastaquesuaclassepossuaummtodopblicoeestticocomonomemainetenhacomoparmetroumvetordeString.

    FuncionamentobsicodaJVM

    ImergindonaJVM

    18FuncionamentobsicodaJVM

  • AoiniciarumaJVMexistemalgunsprocessosquerodamemparaleloseembackgrounseexecutamdiversasoperaeseprocessosparamanteraJVMsempredisponvel:

    OsTimersquesoresponsveispeloseventosqueacontecemperiodicamente,porexemplo,interrupes,elessousadosparaorganizarosprocessosqueacontecemcontinuamente.OsprocessosdoGarbageCollectorqueresponsvelporexecutarasatividadesdocoletordelixodaJVM.Compiladoresquesoresponsveisportransformarbytecodeemcdigonativo.Osouvintes,querecebemsinais(informaes)etemcomoprincipalobjetivoenviaressasinformaesparaoprocessocorretodentrodaJVM.

    FalandoumpoucomaissobreessesprocessosparalelosouThread,aJVMpermitequemltiplosprocessosexecutemconcorrentemente,essarotinaemJavaestdiretamenterelacionadacomumaThreadnativa.TologoumprocessoparaleloemJavanasa,osseusprimeirospassosso:

    AlocaodememriaSincronizaodosobjetosCriaodosregistradoresespecficosparaamesmaeaalocaodaThreadnativa.

    QuandoessarotinageraumaexceoapartenativaenviaessainformaoparaaJVMqueaencerra.QuandoaThreadterminatodososrecursosespecficos,tantoparaoJavaquantoparaapartenativa,soentreguesparaaJVM.

    Comonalinguagem,aJVMoperaemdoistiposdedados:

    1. Osprimitivos2. Osvaloresdereferncia.

    AJVMesperaquetodaaverificaoquantoaotipotenhasidofeitonomomentodaexecuo,sendoqueostiposprimitivosnoprecisodetalverificaoouinspeojqueelesoperamcomumtipoespecficodeinstruo(porexemplo:iadd,ladd,fadd,edaddparainteiro,long,floatedoublerespectivamente).

    AJVMtemsuporteparaobjetosquesoouinstnciadeumaclassealocadadinamicamenteouumarray,essesvaloressodotiporeferenceeoseufuncionamentosemelhanteaodelinguagenscomoC/C++.

    OstiposprimitivosexistentesnaJVMso:

    NumricosBooleanoreturnAdress

    Sendoqueostiposnumricossoosvaloresinteiroseflutuantes.

    Nome Tamanho variao Valorpadro Tipo

    byte 8-bit -2at2 0 inteiro

    short 16-bits -2at2 0 inteiro

    integer 32-bits -2at2 0 inteiro

    long 64-bits -2at2 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

    ImergindonaJVM

    19FuncionamentobsicodaJVM

  • Osformatosdepontoflutuantesoofloat,comprecisosimples,eodouble,comduplapreciso.TantososvalorescomoasoperaesseguemoespecificadonopadroIEEEparaaritmticadepontoflutuantebinrio(ANSI/IEEE.754-1985,NovaYork).Essepadronoincluiapenasvalorespositivosenegativos,maszero,positivoenegativoinfinitoenoumnmero(abreviadocomoNanutilizadopararepresentarvaloresinvlidoscomodivisoporzero).Porpadro,asJVMsuportamesseformato,mastambmpodemsuportarversesestendidasdedoubleefloat.

    OreturnAdressusadoapenaspelaJVM,nopossuirepresentaonalinguagem,temseufuncionamentosimilaraponteirosediferentesdostiposprimitivosnopodemsermodificadosemtempodeexecuo.

    NaJVMotipobooleanopossuiumsuportebemlimitado,noexisteminstruesparabooleano,naverdadeelessocompiladosparausarostiposdeinstruesdointeoarraydebooleanosomanipuladoscomoarraydebyte.Osvaloressorepresentadoscom1paraverdadeiroe0parafalso.

    Falandoumpoucosobreotipodereferncia,existemtrstipos:

    1. classes2. array3. interfaces

    OValorderefernciainiciadocomonull,onulonoumtipodefinido,maspodeserfeitocastparaqualquertipodereferncia.

    Recapitulando,existembasicamentedoistiposdedados:

    PrimitivoseReferncia.Asrefernciaspossuemosseussubtipos:classe,interfaceearray.OsprimitivospossuemreturnAdress,booleano,flutuantes(floatedoubledesimpleseduplaprecisorespectivamente),inteiros(short,byte,int,long,char).

    ImergindonaJVM

    20FuncionamentobsicodaJVM

  • FaladoumpoucosobreostiposdedadosquesoarmazenadosnaJVMeoseutamanho.necessriotambmquesetenhacinciadeondesoarmazenadastaisinformaes.AJVMusaregistradoresparaarmazenarvriascoisassendoqueparatodotipodedadoexisteumlocalespecfico.DuranteaexecuodeumprogramaexistemregistradosquesocompartilhadosentretodaaJVMeoutrosquetemavisibilidadedaThreadcorrente.

    RegistradoresdaJVM

    ImergindonaJVM

    21RegistradoresdaJVM

  • OregistradorPC,Programcounter,criadotologoumaThreadcriada,ouseja,cadaThreadpossuioseu.Elepodearmazenardoistiposdedados:

    1. Ponteirosnativos2. returnAdress

    EssesdadospossueminformaesquantoainstruoqueestsendoexecutadapelaThread.SeomtodoexecutadofornativooPCserumponteiroenotemoseuvalordefinido,docontrrio,eleteroendereodeinstruo,oreturnAdress.

    ProgramCounter

    ImergindonaJVM

    22StackFrame)

  • AssimcomooPC,eleumregistradorprivadoparacadaThread,esseregistradorarmazenaframes(queservistoafrente).SeufuncionamentosimilaralinguagensclssicascomooC,eleserveparaarmazenarvariveislocaiseresultadosparciais,invocaeseresultadosdosmtodos.Elenomodificaasvariveisdiretamentesomenteinserindoeremovendoframesdoregistrador.TologoacorrenteThreadchamaummtodoumnovoframeinserindocontadoinformaescomoparmetros,variveislocais,etc.Assimquandoomtodoterminadeumamaneiranormal,quandoacabaomtodo,ouporinterrupo,quandoocorreumaexceodentrodomtodo,esseframedescartado.OJavaStackpodetertamanhofixooudeterminadodinamicamente.

    JavaStack(Javavirtualmachinestack)

    ImergindonaJVM

    23JavaStack(Javavirtualmachinestack)

  • Cadaframecontmumvetorparaarmazenarvariveislocaiseosparmetroseessetamanhodefinidoemtempodeexecuo.Nessevetorasvariveisdoubleelongocupamdoiselementosdovetoresoarmazenadosconsequentemente.VariveisdotipointereturnAdressocupamumelementodessevetor(byte,shortecharsoconvertidosparaint).Casoomtodosejadainstncia,nosejaesttico,oprimeiroelementodessevetorserocupadopelainstnciaqueestexecutandoessemtodoeemseguidaosparmetros,naordemqueforampassados.Casoomtodosejadaclasse,omtodosejaesttico,Nohaverrefernciadainstnciaquechamaomtodo,assimoprimeiroelementoserosparmetros.

    Stackvariables

    ImergindonaJVM

    24JavaStack(Javavirtualmachinestack)

  • Comoonomeindica,esseregistradorserveparaarmazenarasinstruesqueocorremdentrodomtodo,comooregistradordevariveislocaisosvaloressoarmazenadosemumvetormasseusvaloresrecuperadospelaremoodoltimoelementodovetoremvezdeserpelondice.ElebaseadonaestruturadedadosdePilha(Primeiroaentrarltimoasair).Otamanhodasvariveisacontecemdemaneirasemelhanteasvariveislocais.

    Pilhadeoperao,semelhanteaoseuirmo,suaunidadepossuiotamanhode32bits,seupasso-a-passosegueomesmodeumapilhaconvencional,oultimoqueentrarseroprimeiroasair.Nesseexemploserutilizadoasomadedoisinteiros(10e20).

    Comoapilhadeoperaocompostaporunidadede32bits,quandofordoubleoulongeleocuparasduasunidadesseguidas,nesseexemplososomadosdoisdoubles(10.10e20.20)

    StackOperand

    ImergindonaJVM

    25JavaStack(Javavirtualmachinestack)

  • Essepequenoregistradorpossuiolinkdaconstantpooldaclassequeopossuiocorrentemtodoqueestsendoexecutado.

    FrameData

    ImergindonaJVM

    26JavaStack(Javavirtualmachinestack)

  • Possuifinalidadedearmazenarvariveisevaloresnativos(mtodosescritosemoutraslinguagens),criadotologoumaThreadiniciadaetodasasThreadspossuemoseuregistrador.

    NativeMethodStacks

    ImergindonaJVM

    27NativeMethodStacks

  • Esseregistradortemafinalidadedearmazenarlogicamenteostreamdaclasse,essareacompartilhadaentretodasasThreads.LogicamentefazpartedoHeapespace.PorserpartedoHeapelepossuiorecolhimentodememriaautomtico,GarbageCollector.Asclassescontmasseguintesinformaes:

    Oqualifieddaclasse(Oqualifedoendereodasuaclassequedefinidopelopacotemais.eonomedaClasse,porexemplo,java.lang.Objectoujava.util.Date).Oqualifieddaclassepai(menosparaasInterfaceseojava.lang.Object).Informaoseumaclasseouinterface.Osmodificadores.Alistacomosqualifiedsdasinterfaces.

    ParacadaclassecarregadanoJavacarregadaumconstantpool,quecontmasseguintesinformaes:

    Oconstantpooldotipo(ParacadaclasseCarregadacriadaumpooldeconstant,elecontmolinksimblicoparaosmtodoseparaosatributosalmdasconstantesexistentesnotipo).informaesdosatributos(onomedoatributo,otipoeoseumodificador).informaodosmtodos(onomedomtodo,oseuretorno,onmeroetipodosparmetrosemordemeotipoeoseumodificador).RefernciaparaoClassLoader(classeresponsvelparacarregaraclasse)Variveisdaclasse(variveiscompartilhadasentretodasasclassesissoincluiasconstantes).Refernciadaclasse(umainstnciadajava.lang.Classparatodaclassecarregada).

    MethodArea

    ImergindonaJVM

    28MethodArea

  • Tologoumainstnciacriada,asinformaesdoseuobjetoficamarmazenadosaqui,esseespaodememriatambmcompartilhadoentreasThreads.Oheaptemseumecanismodereclamarmemriaemtempodeexecuoalmdemoverobjetosevitandoafragmentaodoespao.

    RepresentaodeumavariveldotipoderefernciadentrodoHeapdiferentedostiposprimitivos,eletemoseumecanismomuitosemelhanteaosponteirosdoC/C++jqueelenopossuiainformao,apenasapontaparaolocalqueopossui.Oobjetoderefernciaconstitudodedoisponteirosmenores:

    Umapontarparaopooldeobjetos,localaondeestoasinformaes.Osegundoapontarparaoseuconstantpool(quepossuiasinformaesdaclassequantoaosatributos,mtodos,encapsulamentos,etc.)queficalocalizadonomethodArea.

    Arepresentaodosvetoressecomportadeformasemelhanteasvariveisdereferncia,maselesganhamdoiscamposamais:

    1. Otamanho,quedefineotamanhodovetor2. Umalistaderefernciaqueapontamparaosobjetosqueestodentrodessevetor.

    HeapSpace

    ImergindonaJVM

    29HeapSpace

  • ImergindonaJVM

    30HeapSpace

  • EsseregistradorusadoparacompilaoearmazenamentodosmtodosqueforamcompiladosparaomodonativopeloJIT,esseregistradorcompartilhadoportodasasThreads.

    Cachedecdigo

    ImergindonaJVM

    31Cachedecdigo

  • ObytecodeJavainterpretadonosotorpidoquantooscdigosnativos,paracobriresseproblemadeperformance,aJVMverificamtodoscrticos(regiesqueexecutamconstantemente,porexemplo)ecompilaparaocdigonativo.Essecdigonativoserarmazenadodentrodocachedecdigoemumaregioforadaheap.AJVMtentaescolherasregiesmaiscrticasparaquemesmocomogastomemriaepodercomputacionaldecompilarocdigoparanativo,sejaumadecisovantajosa.

    JustInTime(JIT)Compilation

    ImergindonaJVM

    32JustInTime(JIT)Compilation

  • ComissofoifaladosobreosregistradoresquecontmnaJVM,valelembrarquealgumassoexclusivasporThreadsououtrano.Apilhanativasoimportantesparaobterrecursosdamquina,noentanto,osseusvaloressoindefinidos,jaspilhasJavasocriadostologoummtodoiniciadoelesubdivididoemframes,ambasaspilhassoparticularporThread.OregistradorPCnopossuiinformaes,apenasapontaparaainstruoqueestsendoexecutadaepossuiumaporThread.OHeapeomethodAreasocompartilhadasentreaJVM,todasasThreads,etemaresponsabilidadedearmazenarainstnciadosobjetoseostreamseinformaesdaclasserespectivamente.

    Recapitulando

    ImergindonaJVM

    33Recapitulando

  • UmaveztendonoodosregistradoreseaondeficamarmazenadoscadavalornaJVM,serfaladoumpoucosobreofuncionamentodasinstrues,elapossuiopcodeenotamanhode1byte,daobytecode.Cadabytecoderepresentaumaaoouumaoperao.Amaioriadasoperaesdessecdigooperamparaumtipoespecficodevalor,porexemplo,iload(carregarumintparaapilha)eofload(carregaumfloatparaapilha)possuemoperaessemelhantes,noentanto,bytecodesdiferentes.Umaboadicaparasaberotipooperadosaberaletrainicialdaoperao:iparaumaoperaodeinteiro,lparalong,sparashort,bparabyte,cparachar,fparafloat,dparadoubleeaparareferncia.

    ByteCodes

    ImergindonaJVM

    34ByteCodes

  • Essasinstruesrealizamtrocadeinformaesentreovetordevariveislocaiseapilhaoperaes,sendoquecarregar(definidoporiload,lload,fload,dloadeaload)informaesdapilhadevariveisparaoperaesearmazenar(definidopor:istore,lstore,fstore,dstore,astore)realizaoprocessoinverso.

    Carregaresalvarinformaes

    ImergindonaJVM

    35Carregaresalvarinformaes

  • Elassorealizadascomosdoisprimeirosvaloresnapilhadeoperaeseretornandooresultado.Oseuprocessamentosubdivididoemflutuanteseinteirosquepossuemcomportamentosdiferentesparaalgunsresultados,porexemplo,emestourodepilhaedivisoporzero.

    adicionar:iadd,ladd,fadd,dadd.subtrair:isub,lsub,fsub,dsub.multiplicar:imul,lmul,fmul,dmul.diviso:idiv,ldiv,fdiv,ddiv.resto:irem,lrem,frem,drem.negao:ineg,lneg,fneg,dneg.deslocar:ishl,sidh,iushr,lshl,lshr,lushr.bitabit"or":ior,lor.bitabit"and":iand,aterra.bitabitouexclusivo:ixor,lxor.Varivellocalincremente:iinc.Comparao:dcmpg,dcmpl,fcmpg,fcmpl,lcmp.

    Operaesaritmticas:

    ImergindonaJVM

    36Operaesaritmticas

  • Asinstruesdeconversodevaloresserveparamodificarotipodavarivel,essavarivelpodeterseutipoampliadocomo:

    Promoo:intparalong,intparafloat,intparadouble.longparafloatefloatparadouble(i2l,i2f,i2d,l2f,l2d,ef2d)esseampliamentoperdenoperdeaprecisodovalororiginal.Oencurtamentodotipocomo:intparabyte,intparashort,intparachar,longparaint,longparafloatparaintoulongpara,doubleparaint,doubleparalongoudoubleparafloat(i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,ed2f)valelembrarquetaismodificaesexisteapossibilidadedeperderprecisoouestourodovalor.

    Conversodevalores

    ImergindonaJVM

    37Conversodevalores

  • Instruesparaacriaoemanipulaodeinstncias(new)Intruesparacriaodearrays(newarray,anewarray,multianewarray).Acessaratributosestticosoudainstnciadeumaclasse(getfield,putfield,getstatic,putstatic).Carregar(baload,caload,saload,iaload,laload,faload,daload,aaload)Salvarnapilha(bastore,castore,sastore,iastore,lastore,fastore,dastoreeaastore)Vetoresalmdoseutamanho(arraylength).Checaapropriedadedainstnciaouarray(instanceofecheckcast).

    Criaoemanipulaodeobjetos:

    ImergindonaJVM

    38Criaoemanipulaodeobjetos

  • Instruesqueretornamvaloresboolianos(ifeq,ifne,iflt,ifle,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpne,if_icmplt,if_icmple,if_icmpgtif_icmpge,if_acmpeq,if_acmpne,tableswitchelookupswitch,goto,goto_w,jsr,jsr_weret`).

    Instruescondicionais

    ImergindonaJVM

    39Instruescondicionais

  • Aschamadasdeummtodoso:

    invokevirtual:Chamaummtododeumainstnciainvokeinterface:Chamaummtododeumainterfaceinvokespecial:Chamadadeummtodoprivadooudasuperclasseinvokestatic:Realizaachamadadeummtodoestticoinvokedynamic:Mtodoqueconstriumobjeto

    Oretornodeumainstruopodeserdefinido(ireturn,lreturn,freturn,dreturneareturn).Duranteaexecuodomtodocasosejainterrompidademaneirainesperadacomumaexceoachamadaathrowrealizada.Osmtodossncronossopossveisgraaspresenadeumsimplesencapsulandochamadodemonitor,essestiposdemtodossodefinidospelaflagACC_SYNCHRONIZEDemseuconstatepool,quequandopossuitalflagomtodoentranomonitor(monitorenter)eexecutado,enenhumaoutraThreadpodeacess-lo,esai(monitorexit)quandoseumtodoencerrado(deummodonormalouporinterrupo).

    Chamadademtodoseretornodevalores

    ImergindonaJVM

    40Chamadademtodoseretornodevalores

  • Umavezfalandodosbytecodesinteressantespuxaroganchoefalarcomoficaumaclasseapssuacompilao.Comojfoiditoapsacompilaogeradoumbytecode,cujoarquivopossuiaextenso.class,ecadaarquivorepresentaapenasumaclasse.Cadaarquivopossuiasseguintescaractersticas:

    Umnmeromgicoemhexadecimaldefinindoqueessaclaseum.classovalor0xCAFEBABE

    Omaioremenornmerodaversodoarquivoclassquejuntosdefinemaversodoarquivo,ouseja,JVMantesrodarprecisaverificarseaversoVqueelapodeexecutarestarentre:MenorVerso

  • [[refernciadeumamatriz

    Assim,porexemplo:doubledobro(doubled)igual(D)DeDoubledobro(Doubled)(Ljava/lang/Double;)Ljava/lang/Double.

    Dentrodaconstantpoolcadainformaopossuioseuprimeirobytequeindicaoseutipodeinformao:

    CONSTANT_Class7CONSTANT_Fieldref9CONSTANT_Methodref10CONSTANT_InterfaceMethodref11CONSTANT_String8CONSTANT_Integer3CONSTANT_Float4CONSTANT_Long5CONSTANT_Double6CONSTANT_NameAndType12CONSTANT_Utf81CONSTANT_MethodHandle15CONSTANT_MethodType16CONSTANT_InvokeDynamic18

    StackMapTable:compostodestackmapframeetemoobjetivodeverificaesparaobytecode

    ParaauxiliaradepuraonalinguagemJavaexistemalgumasinformaesparadepurarocdigoessasvariveisso:LocalVariableTableeLocalVariableTypeTablequedefineasinformaesdasvariveislocaisparaodebugeLineNumberTabledefineapartedobytecodeesuacorrespondentelinhadecdigo.Paraasanotaesexitem:RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotationsquecontminformaesdasanotaesquantoasuavisibilidadeemtempodeexecuoaosatributosemtodosouno,existemessasmesmasinformaesparaosparmetrosquantoassuasvisibilidades.AnnotationDefaultdefineasinformaesdentrodasanotaes.

    Ocontadordaconsantpoolpossui16bits,ouseja,elespodeconter2=65535elementos,essemesmonmerovaleparaonmerodemtodos,atributos,interfacesimplementadas,variveislocais,pilhadeoperaes(sendoqueparaessesdoisltimosolongoeodoubleocupamdoisespaos),onomedomtodoouatributo.Onmerodedimensesdeumamatriz255omesmonmerovaleparaaquantidadedeparmetros,casonosejaummtodoestticodeve-seincluirainstncia.

    Comoobjetivodepremprticaevisualizaressesbytescodes,serdemonstradoumsimplescdigoeoseurespectivobytecode.

    publicclassPrimeiroTeste{

    publicDoublesomarInstancias(Doublea,Doubleb){

    Doubleresultado=a+b;returnresultado;}

    publicdoublesomarDouble(doublea,doubleb){returna+b;}publicintsomarInteiros(inta,intb){returna+b;}

    publicshortsomarShort(shorta,byteb){return(short)(a+b);}

    ImergindonaJVM

    42Classesapscompilao

  • publicstaticintsomarStatic(inta,intb){returna+b;}

    }

    CriadooarquivoPrimeiroTeste.javaeinseridoocdigo1nessearquivo,osprximospassosseroentrarpeloterminalnocaminhoqueseencontraoarquivoPrimeiroTeste.java,compilareanalisaroseurespectivobytecodecomosseguintescomandos.

    javacPrimeiroTeste.java

    javap-verbosePrimeiroTeste

    Oresultado:

    minorversion:0majorversion:51flags:ACC_PUBLIC,ACC_SUPERConstantpool:#1=Methodref#5.#21//java/lang/Object."":()V#2=Methodref#22.#23//java/lang/Double.doubleValue:()D#3=Methodref#22.#24//java/lang/Double.valueOf:(D)Ljava/lang/Double;#4=Class#25//PrimeiroTeste#5=Class#26//java/lang/Object#6=Utf8#7=Utf8()V#8=Utf8Code#9=Utf8LineNumberTable#10=Utf8somarInstancias#11=Utf8(Ljava/lang/Double;Ljava/lang/Double;)Ljava/lang/Double;#12=Utf8somarDouble#13=Utf8(DD)D#14=Utf8somarInteiros#15=Utf8(II)I#16=Utf8somarShort#17=Utf8(SB)S#18=Utf8somarStatic#19=Utf8SourceFile#20=Utf8PrimeiroTeste.java#21=NameAndType#6:#7//"":()V#22=Class#27//java/lang/Double#23=NameAndType#28:#29//doubleValue:()D#24=NameAndType#30:#31//valueOf:(D)Ljava/lang/Double;#25=Utf8PrimeiroTeste#26=Utf8java/lang/Object#27=Utf8java/lang/Double#28=Utf8doubleValue#29=Utf8()D#30=Utf8valueOf#31=Utf8(D)Ljava/lang/Double;

    Nesseprimeiroresultadopodemosvisualizaraconstantpooleamenoreamaiorversodoclass.OConstantPoolcontmasinformaesdarespectivaclasse,jquetodaclassepossuiessainformao,inclusiveasInnerClasses,eelessoarmazenadasemumvetor.

    publicPrimeiroTeste();flags:ACC_PUBLICCode:stack=1,locals=1,args_size=10:aload_01:invokespecial#1//Methodjava/lang/Object."":()V4:returnLineNumberTable:line1:0

    ImergindonaJVM

    43Classesapscompilao

  • LocalVariableTable:StartLengthSlotNameSignature050thisLPrimeiroTeste;

    publicjava.lang.DoublesomarInstancias(java.lang.Double,java.lang.Double);flags:ACC_PUBLICCode:stack=4,locals=4,args_size=30:aload_11:invokevirtual#2//Methodjava/lang/Double.doubleValue:()D4:aload_25:invokevirtual#2//Methodjava/lang/Double.doubleValue:()D8:dadd9:invokestatic#3//Methodjava/lang/Double.valueOf:(D)Ljava/lang/Double;12:astore_313:aload_314:areturnLineNumberTable:line5:0line6:13LocalVariableTable:StartLengthSlotNameSignature0150thisLPrimeiroTeste;0151aLjava/lang/Double;0152bLjava/lang/Double;1323resultadoLjava/lang/Double;

    publicdoublesomarDouble(double,double);flags:ACC_PUBLICCode:stack=4,locals=5,args_size=30:dload_11:dload_32:dadd3:dreturnLineNumberTable:line10:0LocalVariableTable:StartLengthSlotNameSignature040thisLPrimeiroTeste;041aD043bD

    publicintsomarInteiros(int,int);flags:ACC_PUBLICCode:stack=2,locals=3,args_size=30:iload_11:iload_22:iadd3:ireturnLineNumberTable:line13:0LocalVariableTable:StartLengthSlotNameSignature040thisLPrimeiroTeste;041aI042bI

    publicshortsomarShort(short,byte);flags:ACC_PUBLICCode:stack=2,locals=3,args_size=30:iload_11:iload_22:iadd3:i2s4:ireturnLineNumberTable:line17:0LocalVariableTable:StartLengthSlotNameSignature050thisLPrimeiroTeste;051aS052bB

    publicstaticintsomarStatic(int,int);flags:ACC_PUBLIC,ACC_STATIC

    ImergindonaJVM

    44Classesapscompilao

  • Code:stack=2,locals=2,args_size=20:iload_01:iload_12:iadd3:ireturnLineNumberTable:line21:0LocalVariableTable:StartLengthSlotNameSignature040aI041bI

    Aovermososmtodospodemosperceberquetodososmtodospossuiotamanhodapilhadeoperaoedevariveisalmdotamanhodasvariveisenvolvidasemumdeterminadomtodo.

    Noprimeiroqueomtodoconstrutor,essemtodoconstrudoautomaticamentecasonosejafeitapelousurio,elepossui1tamanhodeoperao,jquesetratadacriaodeumobjetodotiporefernciaeesseocupaumespaonovetordeoperao,1notamanhodevarivel,jqueeleummtodonoestticoeessasinformaespertenceainterfacequeaestchamandoeonmerodevariveisutilizadasdeumjqueestamosnosreferindoainstnciacriada.Nosegundomtodo,asomadeinstnciaseretornaumaterceirainstncia,(Ljava/lang/Double;Ljava/lang/Double;)Ljava/lang/Double,elepossuiotamanhodetrsnapilhadevariveis,jqueumaparaasduasvariveisderefernciaeumajqueomtododainstncia,quatronotamanhodepilhadeoperaes,jquenoprocessoosDoublesserotransformadosemdoubleprimitivo,assimcadaumocuparduasunidadesnovetor.OcampoLineNumberTableparaajudaradebugarocdigonumdeterminadomtodo,LineNumberTable5:0,dizquealinhadenmerocincodocdigojavaequivaleainstruodocomeo,linhazerodobytecodeeline6:13,alinhaseisdocdigojavacomeanainstruodobytecodenmero13.OcampoLocalVariableTabletambmserveparadebugaredefineonomedocampo,tipo,linhaqueelenasceeaquemorre.IssodemonstracomodiferenteocdigoJavaeobyteCodegerado.

    Nessecaptulofalamosumpoucosobreobytecodeeoseumaceteparaentender,olhandopelasiniciasdocomando,valelembrarqueduranteaexecuoosboolianos,byte,shortssotransformadosparainteiros,assimsuasoperaessorealizadascomointeiros.SedemonstrouquodiferenteocdigoJavadobytecodegeradoeemfunodissosecrioutabelasevariveis,porexemplo,LocalVariableeLineNumberTableparaauxiliarnahoradedebugar,essasvariveissoutilizadaspelomododebugdasIDEsmodernas.

    ImergindonaJVM

    45Classesapscompilao

  • TodaclassepelaJVMpossuioseuciclodevida,ecomeaquandoelanascedentrodaJVM,esseprocessofeitodemodolazy,ouseja,aclassXsercarregadanomomentoemquefornecessrio,aoinstanciarumobjetofeitooprocessodeencontrararepresentaobinriadaclasse,carregarasinformaesecolocarasuaclassedentrodaJVM,entocriaroobjeto.TodasasclassesprecisampassarporesseprocessoinclusiveaclassequeiniciaaJVM.Casoaclasseestendadeumaclasseouimplementeinterfacesasmesmasterodesercarregadasprimeiro.Comocadaumdessestrsprocessospossuidetalhes,sediscriminarasaesdecadaum.

    Ciclodevidadeumaclasse

    ImergindonaJVM

    46Ciclodevidadeumaclasse

  • OcarregamentodeclasseconsisteemsubiraclasseparamemriaprincipalecolocarnaJVM,esseprocessoaconteceumavezcompotqualifield,comessestreamcarregadoserealizaoparserparaoregistradormethodAreaeconcluindogeraainterfacequerepresentatalarquivo,ojava.lang.Class.

    AinterfaceClassoprodutodoprocessodecarregaraclasseparaamemriaprincipal,arepresentaodoarquivo,comissoelecontmasinformaesdomesmo,comolistadosmtodos,atributos,interfaces,anotaes,etc.

    AsClassesporsuavez,socarregadaspeloClassLoader(comexceodosarrayquenopossuirepresentaobinria).

    ImergindonaJVM

    47Ciclodevidadeumaclasse

  • NaJVMexistemmltiplosclasseloaderscomdiferentesregras,assimpodemosclassificar-lascomo:

    BootStrapeleseencontranotopodahierarquiadosclassloaders,esseobjetoresponsvelporcarregaraAPIbsicadoJava,eosobjetosquepossuamumaltssimonveldeconfianapelaJVM.ExtensoresponsvelporcarregarasAPIpadresdoJavacomoasdeseguranaeCollection.Osystemesseoclassloaderpadrodaaplicao,eleresponsvelporcarregarasclassesqueestocontidasnoclasspath.AbaixodoSystemClassLoaderousurioadicionarumclassloader,quetemalgunsmotivosespeciais,entreelesdefinirumgrupodeclassloaderespecficoparaumdomnioouaplicao,ocasodosservidoresdeaplacaocomootomcateoGlassfish.

    ApsaclassesercarregadaoprximopassoserlinkarparaJVM,esseprocessoconsistenaverificaodaclasserecm-carregada,eleverificaapalavra-chave,seaestruturaestcorreta,otamanhodosarquivos,apsaverificaosoalocadasmemriasparaosatributoseserosetadososvalorespadrodoscampos,socarregadososatributosestticos,encerrandoesseprocessotodososlinkderefernciasosubstitudosporlinksdiretos.

    Noltimoestgioseracriadaainstnciacomachamadadomtodoconstrutor,sendoqueanteschamadooconstrutordasuperclasse,noexisteverificaoparaasinterfacesapenasseosmtodosforamimplementados.

    ImergindonaJVM

    48Ciclodevidadeumaclasse

  • DiferentedealgumaslinguagensoJavapossuiumgerenciamentodememriaautomtica,issopermitequeamemriadeumobjetonomaisutilizadosejaretomada,essacertamenteumadasgrandesvantagemdaplataformaemrelaoaoC.OprimeirodesafiodaJVMidentificarquaisobjetosdispensveis,eassimretomaramemriacomissofoirealizadovriastcnicasparaassimofazer.

    OmaisconhecidocertamenteoMarkandSweep,basicamentedoisprocessosquemarcaosobjetosutilizadosenofinalosobjetosnomarcadossodispensveispararetomaramemria,omaiorproblemaquetodososprocessossoparadosparaexecutartalprocedimentoinviabilizandocham-loconstantemente.Emfunodesseproblemacitadoanteriormentefalaremosdosegundoalgorismo,quelevaemconsideraoquemuitosobjetosnopossuemumalongavida,noentanto,algunslevambastantetemponamemria,assimosalgoritmossebaseiaemgeraesquedivideamemriaemtrspartes(jovem,efetivaepermanente).

    Paramelhorgerenciarocoletordelixoamemriaheapdividiabasicamenteemalgumaspartes:

    YoungGeneration:ondecontmosobjetosrecm-criados,agrandemaioriadosobjetosmorremdentrodessarea.Elasubdividaemduaspartes:Eden(localaondeoobjetosnascem)eSurvivers(N)locaisaondeosobjetosvopassandoatsairdaYoungGeneration.Oseufuncionamentodemaneirasimples:OsobjetosnascemnoEden,depoisdeumtempo,osobjetossocopiadosvivosparaosSurvivers,osobjetosquenoforamcopiadosnosoapagados,masnofuturo,outrosobjetosocuparoseuespao.ComopassardascoleesosobjetosexistentessaemdaYoungevoparaTenuredgeneration,nesseespaoogerenciamentodeobjetosrealizadodeformadiferente,assimnohcpia,existemalgoritmosderivadosdoSwepandMark,comosobjetosapagadosaprximapreocupaoseremrelaoafragmentaodoregistrador,assimhaveroprocessodecompactaodosdados.

    GarbageCollector

    ImergindonaJVM

    49GarbageCollector

  • Comentadoumpoucosobreosprocessosdeminorcollector(procedimentodegenerationquecpiaobjetospararegistradoressobreviventes)eomaiorcollector(procedimentocujoosalgoritmossoderivadosdeMarkandSwepqueapagaosobjetosnoutilizadosequandofragmentadaamemriahaveroprocedimentodecompactao,valelembrarqueparatalprocedimentoaJVMparatodososseusprocessos).OobjetivoagoraserfalaroestiloouomododosGarbageCollector.

    ImergindonaJVM

    50GarbageCollector

  • Esseestilomuitoindicadoparapequenasaplicaesouhardwaredepequenopodercomputacionaleapenasumprocessador,monocore,elesenabaseianaexecuodosprocessos,maioremenorcollector,utilizandoapenasumaThread,dessemodopodeeconomizarrecursos,pormcasohajaumgrandenmerodememriahaverumgrandedelay.

    ImplementaoSerial

    ImergindonaJVM

    51ImplementaoSerial

  • Trabalhadeformasemelhantedaserial,noentanto,serutilizadoduasoumaisThreadsporcoleo,assimoprocessotendeaserrealizaremumtempomenor,pormutilizandomaisrecursosdemquina.

    ImplementaoParalelo

    ImergindonaJVM

    52ImplementaoParalelo

  • Essetambmexecutaprocessosemparalelos,noentanto,oseuobjetivodiminuirotempodomaiorcollector,mesmoqueparaissooexecutevriasvezes.Indicadoparamuitosobjetosdurammuitotempo,assimelesficamnaTurnered.EmresumoseuprocessodividerealizarmarcaoemquetodasasThreadestoparadasemarcaesconcorrentes,masaremoodosobjetosocorremsemnenhumprocessoparar,onicoproblemadesseestiloofatoquenohcompactaodedadosperidicos,apenasquandosetornacrtico(usandooSerialOdl).

    ImplementaoConcurrent

    ImergindonaJVM

    53ImplementaoConcurrent

  • Tambmconcorrente,masrealizadodeformaincremental(realizadoaospoucoseagendadoentreasminor-collector)seufuncionamentobemsemelhanteaoanterior,masadicionaumprocessoqueredimensionareprepararosdadosparaumaprximacoleoocicloquecontrolaotempoqueocolectorficanoprocessador.Casotenhaproblemascomfragmentao,eletambmacionaroserialOdl(quealmderemoverosdadostambmcompactarosobjetossobreviventes).

    ImplementaoIncrementalConcurrent

    ImergindonaJVM

    54ImplementaoIncrementalConcurrent

  • Lanadonaverso7doJava,oGarbagefirst,coletorparaleloprojetadaparaterumgrandethroughput,elefoiprojetadoparasistemascomumaaltaquantidadedememriaedeprocessadores.ParaalcanarseuobjetivoeledivideigualmenteotamanhodoHeap.Assimcomoosdoisltimosconcorrentes,elepossuiumafaseemquerealizaamarcaoconcorrente,erealizaocalculodeobjetosalcanveisdecadaregio,assimdetemposemtempos,todososprocessossoparadososobjetosvivossocopiadosparaoutraregio,fazendocomquearegioemquestosejatotalmentetomada.Teromaiorprioridadeasregiescomomaiornmerodeobjetosmortos(assimsetermenostrabalhoemrealizaracopiaparaaoutrarea).OG1veioparasubstituirostiposconcorrentedecoleo(CMSeI-CMS)devidoalacunaqueambosdeixavam.

    Noterumtempodeterminadoparadeixaroprocessadoreacompactaodoheap(umavezquemuitocrticachamadaoserialOdl).OG1tomacomoestratgiaofatodesermaisfcilcontrolarpequenasregiesdoqueumagerao,umoutroaspectoquetologoasmemriasexistentestenhasidocopiadoparaumanovarea,aanteriorconsideradaumarealimpa.

    ImplementaoGarbageFirst

    ImergindonaJVM

    55ImplementaoGarbageFirst

  • MuitosefaladoJava,principalmentedofatodelesermultiplataforma,talvezessacaractersticaemespecial,desecompilarumavezepoderrodaremdiversasplataformas,tornouoJavaalinguagemeplataformamaispopularnomundo.MuitosetemexploradojquetodaacomplexidadefeitapelaJVM,massurgeaseguintedvida:ComoaJVMfazisso?Comoelaconseguirabstrairasoutrasplataformasparamin?ObteresseconhecimentomuitoimportanteumavezquepodesernecessrioutilizarumrecursoespecficodamquinaefazercomesserecursoconversediretamentecomaJVM.

    AcomunicaoentreaJVMeocdigonativoquaseemsuagrandemaioriafeitonalinguagemC/C++umavezqueelaspossuemopadroANSIequeomesmocompatvelcomagrandemaioriadasplataformas,assimpossvelumgrandeaproveitamentodecdigo,masemalgunscasosnecessrioquesejafeitaumaimplementaoespecficaparacadaplataformaouqueexistecompatibilidadecomumsistemalegadoquefoifeitoemC,porexemplo.AportaentreocdigonativoeoJavaconhecidocomoJNI(JavaNativeInterface).EsserecursomuitointeressantetambmparafazeraponteparaplataformasemqueoJavaaindanoatingiu.DentrodaJVMesserecursousadoparaalgunsnaplataformaJSE,porexemplo,JavaI/O,algunsmtodosdaclassejava.lang.System,JavaSound,acomunicaoentreaclasse,oarquivo.class,easuarepresentaodentrodaJVM,aimplementaodainterfacejava.lang.Class,asimplementaesdoGarbageColectordentreoutrosrecursos.ComoJNIpossvelchamarmtododoobjeto,instanciarclasses,verificarestadodoobjetocriadodentrodaJVM,dentreoutrosrecursos.

    Noentanto,usarorequeralgumasresponsabilidades,valelembrarqueusaroJNIperdeaportabilidade,umerronativonocontroladopelaJVM(Valelembrarnaparteemquesefalouderegistrados,apilhanativaeoPCquandoapontaparaumprocessonativo,nosesabeoseuvalorpreciso),nopossveldebugarocdigonativoatravsdaplataformaJava,casoaconteceumerronativopodequebraraexecuodaJVM,elenoproverumGarbageCollectorautomticoouqualquergerenciamentoporpartedaJVM.AssimmuitoimportantesaberomomentoemqueseusaroJNI.

    OsobjetosemJavapodemsermapeadosparaobjetosnativosevirse-versa,paragarantiracomunicaodeduasmos,assimpossvelestarpassandoumobjetoJavaparaoladonativoveroseuvalor.

    TipoemJava TipoNativo

    boolean jboolean

    byte jbyte

    char jchar

    double jdouble

    float jfloat

    int jint

    long jlong

    short jshort

    void void

    ComoobjetivodedarumpequenoexemplocomoJNIsermostradodoissimplesexemplos,oprimeiroseroolmundocomoJNIeosegundoserummtodoestticoquecalculaodobrodoresultadopassado,paraissonecessrioquesetenhainstaladooGCCeoJDK.Ocdigoserbemsimples,noprimeirocasoserenviadoonomeporparmetroeessaStringserpassadaparaovalornativo,umaveznonativoserconcatenadooHelloworldcomonomedigitado,nosegundoexemplo,osegundoparmetroseriacalculadooseudobro.

    PrimeiramentesercriadoaclasseHelloWorld.java.

    InterfaceNativaJava

    ImergindonaJVM

    56InterfaceNativaJava

  • publicclassHelloWorld{

    privatenativevoidchamarMensagem(Stringnome);

    publicnativestaticintdobrar(intvalor);

    publicstaticvoidmain(String[]args){

    Stringnome=args[0]==null?"nome":args[0];intvalor=args[1]==null?2:Integer.valueOf(args[1]);

    HelloWorldhelloWorld=newHelloWorld();helloWorld.chamarMensagem(nome);

    intresultado=HelloWorld.dobrar(valor);System.out.println("Odobrode"+valor+":"+resultado);}

    static{System.loadLibrary("HelloWorld");}

    }

    Emseguidacompilamoscomoseguintecomando:

    javacHelloWorld.java

    Umavezoarquivocompilado,sernecessriogerarainterfaceJNIcomoseguintecomando:

    javah-jniHelloWorld

    ComocomandosergeradoumarquivoHelloWorld.h.

    /*DONOTEDITTHISFILE-itismachinegenerated*/#include/*HeaderforclassHelloWorld*/

    #ifndef_Included_HelloWorld#define_Included_HelloWorld#ifdef__cplusplusextern"C"{#endif/**Class:HelloWorld*Method:chamarMensagem*Signature:(Ljava/lang/String;)V*/JNIEXPORTvoidJNICALLJava_HelloWorld_chamarMensagem(JNIEnv*,jobject,jstring);

    /**Class:HelloWorld*Method:dobro*Signature:(I)I*/JNIEXPORTjintJNICALLJava_HelloWorld_dobrar(JNIEnv*,jclass,jint);

    #ifdef__cplusplus}#endif#endif

    Reparequenainterfaceomtodopossuioseguinteformato:

    Java_NomeClasse_nomeMetodo.Emrelaoaosparmetrosoprimeiroelemento,oJNIEnv,eleumponteiroqueapontaparaumvetornoqualpossuitodasasfunesdoJNI,osegundodependesemtododaclasseoudainstncia.Casosejaesttico,ousejaomtodopossuaapalavra-chavestatic,oprximoparmetroserojclassqueconteras

    ImergindonaJVM

    57InterfaceNativaJava

  • informaesdaclasse,casosejadainstnciaoprximoparmetroserojobjectqueconterasinformaesdainstncia.

    OprximopassoacriaodoarquivoqueimplementeainterfacedoHelloWorld.h,assimsercriadooHelloWorld.cqueimplementetalinterface.

    #include#include"HelloWorld.h"#include

    JNIEXPORTvoidJNICALLJava_HelloWorld_chamarMensagem(JNIEnv*env,jobjectobj,jstringnome){constchar*nomeNativo=(*env)->GetStringUTFChars(env,nome,NULL);printf("HelloWorld!!!!%s\n",nomeNativo);return;}

    JNIEXPORTjintJNICALLJava_HelloWorld_dobrar(JNIEnv*env,jclassclasse,jintvalor){

    return2*valor;}

    Comoarquivocriadooprximopassoacompilao,levandoemconsideraoasdevidasimportaes,comosetratadelibsnativasaspastasvariamdeacordocomaplataforma.Nocasodolinuxparacompilarsernecessriooseguintecomando:

    gcc-olibHelloWorld.so-shared-I$JAVA_HOME/include-I$JAVA_HOME/linuxHelloWorld.c

    Umavezcompiladoocdigo-fonteeotransformadoemumalib,nocasodolinuxoarquivocomextenso.sodeSharedObject.Oprximopassoserlinkaroarquivonativocomoprojeto,oprimeiropassocarregarabibliotecadentrodocdigojava(paraissoserutilizadoocomandoSystem.loadLibrary("NomedaLib");).

    Oprximopassocolocaralibnativanoclasspathnosistemaoperacionaloudefiniroseucaminhopeloparmetrojava.library.pathaoexecutaroprojetojava.Nesseexemploserutilizadoasegundaopojuntamenteoparmetroqueseronomedaqueserimpressonoconsole,assimocomandoficar:

    java-Djava.library.path=.HelloWorldOtvio4

    Asadaser:

    HelloWorld!!!!Otvio

    `Odobrode5:10

    ComissoseapresentouorecursodoJNI,ainterfacequesecomunicaoJVMparalinguagensnativacomoCeC++edasuaimportnciaparaaJVMcomoaimplementaodoGarbageCollector,suaexistnciaemalgumasAPIscomooJavaSoundalmdeseintegrarcomcdigolegadoecomplataformascujoaJVMatomomentonoatingiu.Noentanto,valesalientarqueseperdeofatormultiplataformaenosermaisgerenciadopelaJVMusandoesterecurso.AprendersobreJNImuitoimportanteparacompreenderocdigodamquinavirtualJava,masnecessrioumconhecimentonalinguagemCeC++.`

    ImergindonaJVM

    58InterfaceNativaJava

  • OOpenJDKumprojetoquefoiiniciadopelaSunMicrosystems,atualmentemantidopelaporvriasempresaseacomunidade,paraacriaodeumJavaDevelopmentKitbaseadototalmenteemsoftwarelivreedecdigoaberto.Oprojetofoiiniciadoem2006etemcomobaseoHotSpot(ajvmdaSun).Umaconquistaparaoprojetoquevalesalientarqueapartirdaverso7doJavaoOpenJDKaversodereferncia,masalmdessaousodoOpenJDKtegarantealgumasvantagens:

    1. Aprimeiravantagemqueeleopensource,ouseja,podeestudaroseucdigofonte.

    2. Elaagoraaimplementaodereferncia,ouseja,sefazerumaplicativoquerodeemqualquerJVM,essagarantiaserpossvelapenascomoOpenJDK

    3. AcomunidadeJavacertamenteumadascomunidadesmaisfortesdomundo.AJVMdoprojeto,porexemplo,estpassandoporconstantesrefatoraesparamelhoriadeperformance,atualizaodebibliotecaseatualizaodocdigosemfalarqueparaadicionarqualquerrecursonecessrioquesetenhatestes.

    4. AOracledoouocdigofontedojRockitenojava8,previstoparaofinalde2013,ocdigosejaintegradocomoHotspot.Ouseja,noopenjdkhaverosmelhoresdedoismundosemumslugar.

    5. Vriasempresasfazempartedesseprojeto,ouseja,umaJVMcomoKnow-howdevriasempresasemtodoomundo.EmpresascomoIBM,Apple,SAP,Mac,Azul,Intel,RedHatetc.fazempartedoprojeto.

    6. SeaOracledeixaroJava(Algoqueeuachomuitodifcilpordiversosmotivos)edeixardefazeraJVM.OOpenJDKnoseremnenhummomentoabaladojqueexistemoutrasempresasapoiandoalmdacomunidade.

    AdiferenaentreessasduasJVMs,HotSpot(aJVMmaispopulardaSunatualmentedaOracle)eoOpenJDK,estnaadiodecdigosfechadosalmdepequenasmudanasnaimplementaoparaimplementaesfechadasparaaJVMdaOracle,adessemelhanadecercade4%decdigo.OqueacontecequenemtodososcdigosforamabertoscomxitojquealgunspertenceaterceirosesoapenaslicenciadosnapocapelaSun.

    TodamudanadentrodoJavarealizadaatravsdasubmissodeumaJSR,JavaSpecificationRequests,queumdocumentoquepossuiinformaesquantoamelhoriaaserfeitaeseusimpactosdentrodalinguagem.EssasJSRssoselecionadasapartirdoJCP,JavaCommunityProcess,quecompostapor31instituies(PodemosdestacaraparticipaodaOracle,SouJavaeLondonComunity).EssasinstituiestmamissodevotarafavoroucontraumaJSR.Quandoexisteumamudananaplataforma(JSE,JEE,JME)ditoqueelapossuiumguarda-chuvadeespecificaes(JqueumamudanadeplataformaresultadodediversasJSRs,porexemplocomoJava7,

    OprojetoOpenJDK

    ImergindonaJVM

    59OprojetoOpenJDK

  • documentadanaJSR336,possuidentrodelaasJSRs314oprojetoCoin,203oNIO2,292oinvokedynamic).

    ComoOpenJDKnodiferente,todasassuasmudanasprecisamestardocumentadasemJSRsquesovotadaspeloJCP,nocasodeumanovaversodaplataformaJSE,precisaterumconjuntodeJSRouumguarda-chuvadeespecificao.Noentanto,paramelhorias,refatoraesexisteoJEP,JDKEnhancementProposalsoupropostasdemelhoriasparaoJDK.

    Ocdigodoprojetomantidoemmercurialemaisinformaesdoprojetopodeserencontradoem:http://openjdk.java.net/

    Parabaixarocdigonecessrio:

    hgclonehttp://hg.openjdk.java.net/jdk8/jdk8jdk8(parabaixarocdigofonteemsuamquina).

    cdjdk8(entrandonodiretrio,ondeseencontraocdigofonte).

    shget_source.sh(shellscriptparabaixarocdigofontedosmdulosdaJVM).

    AobaixarocdigoseverqueoprojetoOpenJDKcompostoporsubprojetos:

    ImergindonaJVM

    60OprojetoOpenJDK

    IntroductionCrditoSobre o AutorFalando um pouco sobre JVMSe queres prever o futuro, estuda o passadoHistrico da JVMJDK Alpha e Beta (1995)JDK 1.1 (19 de fevereiro de 1997)J2SE 1.2 (8 de dezembro de 1998)J2SE 1.3 (8 de maio de 2000)J2SE 1.4 (6 de fevereiro de 2002)J2SE 5.0 (30 de setembro de 2004)Java SE 6 (11 de dezembro de 2006)Java SE 7 (28 de julho de 2011)Java SE 8 (18 de maro de 2014)Stack Frame)

    Funcionamento bsico da JVMRegistradores da JVMJava Stack (Java virtual machine stack)Native Method StacksMethod AreaHeap SpaceCache de cdigoJust In Time (JIT) Compilation

    Recapitulando

    ByteCodesCarregar e salvar informaesOperaes aritmticasConverso de valoresCriao e manipulao de objetosInstrues condicionaisChamada de mtodos e retorno de valoresClasses aps compilao

    Ciclo de vida de uma classeGarbage CollectorImplementao SerialImplementao ParaleloImplementao ConcurrentImplementao Incremental ConcurrentImplementao Garbage First

    Interface Nativa JavaO projeto OpenJDK