Upload
jean-lopes
View
236
Download
2
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