Uvod u JVM predmemoriju koda

1. Uvod

U ovom ćemo uputstvu na brzinu pogledati i naučiti o predmemoriji JVM-ove kodne memorije.

2. Što je predmemorija koda?

Jednostavno rečeno, JVM predmemorija koda je područje u kojem JVM pohranjuje svoj bajt kod sastavljen u izvorni kôd. Svaki blok izvršnog izvornog koda nazivamo a nmetoda. The nmetoda može biti cjelovita ili umetnuta Java metoda.

Prevoditelj Just-in-time (JIT) najveći je potrošač područja predmemorije koda. Zato neki programeri ovu memoriju nazivaju predmemorijom JIT koda.

3. Podešavanje predmemorije koda

Predmemorija koda ima fiksnu veličinu. Jednom kad se napuni, JVM neće kompajlirati dodatni kôd jer je JIT kompajler sada isključen. Nadalje, primit ćemo “CodeCache je pun ... Kompajler je onemogućen”Poruka upozorenja. Kao rezultat, u našoj ćemo aplikaciji završiti s pogoršanim performansama. Da bismo to izbjegli, možemo prilagoditi predmemoriju koda sa sljedećim opcijama veličine:

  • InitialCodeCacheSize - početna veličina predmemorije koda, zadana 160K
  • ReservedCodeCacheSize - zadana maksimalna veličina je 48 MB
  • CodeCacheExpansionSize - veličina proširenja predmemorije koda, 32 KB ili 64 KB

Povećavanje ReservedCodeCacheSize može biti rješenje, ali to je obično samo privremeno rješenje.

Srećom, JVM nudi a UseCodeCacheFlushing mogućnost kontrole ispiranja područja predmemorije koda. Njegova je zadana vrijednost false. Kad to omogućimo, to oslobađa okupirano područje kada su ispunjeni sljedeći uvjeti:

  • predmemorija koda je puna; ovo se područje ispire ako njegova veličina prelazi određeni prag
  • prošao je određeni interval od zadnjeg čišćenja
  • predkompilirani kôd nije dovoljno vruć. Za svaku kompiliranu metodu JVM prati poseban brojač vrućine. Ako je vrijednost ovog brojača manja od izračunatog praga, JVM oslobađa ovaj dio unaprijed sastavljenog koda

4. Upotreba predmemorije koda

Da bismo nadzirali upotrebu predmemorije koda, moramo pratiti veličinu trenutno korištene memorije.

Da bismo dobili informacije o upotrebi predmemorije koda, možemo odrediti –XX: + PrintCodeCache JVM opcija. Nakon pokretanja naše aplikacije vidjet ćemo sličan izlaz:

CodeCache: veličina = 32768Kb upotrijebljeno = 542Kb max_used = 542Kb besplatno = 32226Kb 

Pogledajmo što znači svaka od ovih vrijednosti:

  • veličina u izlazu prikazuje maksimalnu veličinu memorije, koja je identična ReservedCodeCacheSize
  • koristi je stvarna veličina memorije koja se trenutno koristi
  • max_used je maksimalna veličina koja je bila u upotrebi
  • besplatno je preostala memorija koja još nije zauzeta

The PrintCodeCache opcija je vrlo korisna, jer možemo:

  • vidjeti kad se dogodi ispiranje
  • utvrditi jesmo li dosegli kritičnu točku korištenja memorije

5. Segmentirana predmemorija koda

Od Jave 9, JVM dijeli predmemoriju koda u tri različita segmenta od kojih svaki sadrži određenu vrstu prevedenog koda. Točnije, postoje tri segmenta:

  • Segment bez metode sadrži JVM interni srodni kod, poput interpretatora bajt koda. Prema zadanim postavkama ovaj je segment oko 5 MB. Također je moguće konfigurirati veličinu segmenta putem -XX: NonNMethodCodeHeapSize zastava za podešavanje
  • Segment profiliranog koda sadrži blago optimizirani kôd s potencijalno kratkim životnim vijekom. Iako je veličina segmenta prema zadanim postavkama oko 122 MB, možemo ga promijeniti putem -XX: ProfiledCodeHeapSize zastava za podešavanje
  • Neprofilirani segment sadrži potpuno optimizirani kôd s potencijalno dugim vijekom trajanja. Slično tome, prema zadanim postavkama ima oko 122 MB. Ovu vrijednost je, naravno, moguće konfigurirati putem -XX: NonProfiledCodeHeapSize zastava za podešavanje

Ova nova struktura različito tretira različite vrste usklađenih kodova, što dovodi do boljih ukupnih performansi.

Na primjer, odvajanje kratkotrajnog kompiliranog koda od dugotrajnog koda poboljšava izvedbu metra - uglavnom zato što treba skenirati manje područje memorije.

6. Zaključak

Ovaj kratki članak predstavlja kratki uvod u JVM predmemoriju koda.

Pored toga, predstavili smo neke mogućnosti korištenja i podešavanja za nadgledanje i dijagnosticiranje ovog područja memorije.