Introduktion til JVM Code Cache

1. Introduktion

I denne vejledning skal vi hurtigt se på og lære om JVM's kodehukommelse.

2. Hvad er kodecache?

Kort fortalt, JVM Code Cache er et område, hvor JVM gemmer sin bytecode, der er sammensat til native-kode. Vi kalder hver blok af den eksekverbare native-kode a nmethode. Det nmethode kan være en komplet eller indbygget Java-metode.

Just-in-time (JIT) kompilatoren er den største forbruger af kode cache-området. Derfor kalder nogle udviklere denne hukommelse en JIT-cache.

3. Kodecacheindstilling

Kodecachen har en fast størrelse. Når den er fuld, kompilerer JVM ikke yderligere kode, da JIT-compileren nu er slået fra. Desuden modtager vi “CodeCache er fuld… Compileren er deaktiveret”Advarselsmeddelelse. Som et resultat ender vi med forringet ydeevne i vores applikation. For at undgå dette kan vi indstille kodecachen med følgende størrelsesindstillinger:

  • InitialCodeCacheSize - den oprindelige kode cache størrelse, 160K standard
  • ReservedCodeCacheSize - standard maksimumstørrelse er 48 MB
  • CodeCacheExpansionSize - udvidelsesstørrelsen på kodecachen, 32KB eller 64KB

Forøgelse af ReservedCodeCacheSize kan være en løsning, men dette er typisk kun en midlertidig løsning.

Heldigvis tilbyder JVM en Brug CodeCacheFlushing mulighed for at kontrollere skylningen af ​​kode cache-området. Dens standardværdi er falsk. Når vi aktiverer det, det frigør det besatte område, når følgende betingelser er opfyldt:

  • kode cachen er fuld; dette område skylles, hvis dets størrelse overstiger en bestemt tærskel
  • det bestemte interval er gået siden sidste oprydning
  • den forud kompilerede kode er ikke varm nok. For hver kompilerede metode holder JVM styr på en speciel varmetæller. Hvis værdien af ​​denne tæller er mindre end en beregnet tærskel, frigiver JVM dette stykke forudkompileret kode

4. Brug af kode-cache

For at overvåge kodebrugsforbruget skal vi spore størrelsen på den hukommelse, der aktuelt er i brug.

For at få oplysninger om brug af kode-cache kan vi specificere –XX: + PrintCodeCache JVM-mulighed. Efter at have kørt vores applikation ser vi en lignende output:

CodeCache: størrelse = 32768Kb brugt = 542Kb max_used = 542Kb fri = 32226Kb 

Lad os se, hvad hver af disse værdier betyder:

  • størrelse i output viser den maksimale hukommelsesstørrelse, som er identisk med ReservedCodeCacheSize
  • Brugt er den aktuelle størrelse på den hukommelse, der aktuelt er i brug
  • max_used er den maksimale størrelse, der har været i brug
  • ledig er den resterende hukommelse, som endnu ikke er optaget

Det PrintCodeCache mulighed er meget nyttig, som vi kan:

  • se hvornår skylningen sker
  • afgøre, om vi nåede et kritisk punkt for hukommelsesforbrug

5. Segmenteret kodecache

Fra Java 9 opdeler JVM kodecachen i tre forskellige segmenter, som hver indeholder en bestemt type kompileret kode. For at være mere specifik er der tre segmenter:

  • Segmentet, der ikke er metode, indeholder JVM-intern kode, såsom bytecode-tolken. Som standard er dette segment omkring 5 MB. Det er også muligt at konfigurere segmentstørrelsen via -XX: NonNMethodCodeHeapSize tuning flag
  • Det profilerede kodesegment indeholder let optimeret kode med potentielt korte levetider. Selvom segmentstørrelsen er omkring 122 MB som standard, kan vi ændre den via -XX: ProfiledCodeHeapSize tuning flag
  • Det ikke-profilerede segment indeholder fuldt optimeret kode med potentielt lang levetid. Tilsvarende er det omkring 122 MB som standard. Denne værdi kan selvfølgelig konfigureres via -XX: NonProfiledCodeHeapSize tuning flag

Denne nye struktur behandler forskellige typer af overholdt kode forskelligt, hvilket fører til bedre samlet præstation.

For eksempel forbedrer adskillelse af kortvarig kompileret kode fra langvarig kode metoden fejningsydelse - hovedsageligt fordi den skal scanne en mindre hukommelsesregion.

6. Konklusion

Denne hurtige artikel præsenterer en kort introduktion til JVM Code Cache.

Derudover præsenterede vi nogle anvendelses- og tune-up-muligheder for at overvåge og diagnosticere dette hukommelsesområde.


$config[zx-auto] not found$config[zx-overlay] not found