imergindo na jvm
DESCRIPTION
imersão na java virtual machineTRANSCRIPT
-
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