Vodič za najvažnije JVM parametre

1. Pregled

U ovom brzom uputstvu istražit ćemo najpoznatije opcije koje se mogu koristiti za konfiguriranje Java virtualnog stroja.

2. Eksplicitna memorija hrpe - Xms i Xmx opcije

Jedna od najčešćih praksi vezanih uz izvedbu je inicijalizacija hrpe memorije prema zahtjevima aplikacije.

Zato bismo trebali odrediti minimalnu i maksimalnu veličinu hrpe. Za njegovo postizanje mogu se koristiti donji parametri:

-Xms [jedinica] -Xmx [jedinica]

Ovdje, jedinica označava jedinicu u kojoj memorija (označena s veličina hrpe) treba inicijalizirati. Jedinice se mogu označiti kao "G" za GB, 'M' za MB i "K" za KB.

Na primjer, ako JVM-u želimo dodijeliti najmanje 2 GB, a najviše 5 GB, moramo napisati:

-Xms2G -Xmx5G

Počevši od Jave 8, veličine Metaprostor nije definirano. Jednom kad dosegne globalnu granicu, JVM ga automatski povećava. Međutim, da bismo prevladali bilo kakvu nepotrebnu nestabilnost, možemo postaviti Metaprostor veličina sa:

-XX: MaxMetaspaceSize = [jedinica]

Ovdje, veličina metaprostora označava količinu memorije kojoj želimo dodijeliti Metaprostor.

Prema Oracleovim smjernicama, nakon ukupne dostupne memorije, drugi najutjecajniji čimbenik je udio hrpe rezerviran za Mladu generaciju. Prema zadanim postavkama minimalna veličina YG-a je 1310 MB, a maksimalna veličina je neograničen.

Možemo ih izričito dodijeliti:

-XX: NewSize = [jedinica] -XX: MaxNewSize = [jedinica]

3. Odvoz smeća

Za bolju stabilnost aplikacije presudan je odabir pravog algoritma za sakupljanje smeća.

JVM ima četiri vrste GC implementacije:

  • Serijski sakupljač smeća
  • Paralelni sakupljač smeća
  • CMS skupljač smeća
  • G1 Sakupljač smeća

Te se implementacije mogu deklarirati sa sljedećim parametrima:

-XX: + UseSerialGC -XX: + UseParallelGC -XX: + USeParNewGC -XX: + UseG1GC

Više detalja o Kolekcija smeća implementacije možete pronaći ovdje.

4. GC bilježenje

Da bismo strogo nadzirali stanje aplikacije, uvijek bismo trebali provjeriti JVM-ove Kolekcija smeća izvođenje. Najlakši način za to je prijaviti GC aktivnost u ljudskom čitljivom formatu.

Pomoću sljedećih parametara možemo zapisati datoteku GC aktivnost:

-XX: + KoristiGCLogFileRotation -XX: NumberOfGCLogFiles = -XX: GCLogFileSize = [jedinica] -Xloggc: /path/to/gc.log

UpotrijebiteGCLogFileRotation određuje politiku valjanja datoteke dnevnika, slično kao log4j, s4lj itd. NumberOfGCLogFiles označava maksimalan broj datoteka dnevnika koji se mogu zapisati za jedan životni ciklus aplikacije. GCLogFileSize određuje maksimalnu veličinu datoteke. Konačno, loggc označava njegovo mjesto.

Ovdje valja napomenuti da su na raspolaganju još dva JVM parametra (-XX: + IspisGCTimeStamps i -XX: + IspisGCDateStamps) koja se može koristiti za ispis vremenske oznake po datumu u GC zapisnik.

Na primjer, ako želimo dodijeliti najviše 100 GC datoteke dnevnika, svaka maksimalne veličine 50 MB i želi ih pohraniti u '/ home / user / log / ' mjesto, možemo koristiti donju sintaksu:

-XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = 10 -XX: GCLogFileSize = 50M -Xloggc: /home/user/log/gc.log

Međutim, problem je što se jedna dodatna nit demona uvijek koristi za nadgledanje vremena sustava u pozadini. Ovo ponašanje može stvoriti usko grlo u izvedbi; zato je uvijek bolje ne igrati se s tim parametrom u proizvodnji.

5. Rukovanje memorijom

Vrlo je često da se velika aplikacija suoči s pogreškom u memoriji koja, zauzvrat, rezultira padom aplikacije. To je vrlo kritičan scenarij i vrlo ga je teško ponoviti za rješavanje problema.

Zato JVM dolazi s nekim parametrima koji hrpu memorije izbacuju u fizičku datoteku koja se kasnije može koristiti za otkrivanje curenja:

-XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath =. / Java_pid.hprof -XX: OnOutOfMemoryError = ";" -XX: + Koristite GCOverheadLimit

Ovdje treba napomenuti nekoliko točaka:

  • HeapDumpOnOutOfMemoryError nalaže JVM-u da izbaci hrpu u fizičku datoteku u slučaju OutOfMemoryError
  • HeapDumpPath označava put na koji se datoteka treba zapisati; može se dati bilo koje ime datoteke; međutim, ako JVM pronađe a u nazivu, ID procesa trenutnog procesa koji uzrokuje pogrešku zbog nedostatka memorije bit će dodan nazivu datoteke s .hprof format
  • OnOutOfMemoryError koristi se za izdavanje hitnih naredbi koje se izvršavaju u slučaju pogreške izvan memorije; odgovarajuću naredbu treba koristiti u prostoru cmd argumenata. Na primjer, ako želimo ponovno pokrenuti poslužitelj čim dođe do nestanka memorije, možemo postaviti parametar:
-XX: OnOutOfMemoryError = "shutdown -r"
  • Koristite GCOverheadLimit je politika koja ograničava udio vremena VM-a provedenog u GC prije Bez memorije baca se pogreška

6. 32/64 bit

U OS okruženju gdje su instalirana i 32 i 64-bitna paketa, JVM automatski odabire 32-bitne pakete zaštite okoliša.

Ako želimo okruženje ručno postaviti na 64 bit, to možemo učiniti pomoću donjeg parametra:

-d

OS bit može biti bilo koji 32 ili 64. Više informacija o tome možete pronaći ovdje.

7. Razno

  • -služitelj: omogućuje “Server Hotspot VM”; ovaj se parametar prema zadanim postavkama koristi u 64-bitnom JVM-u
  • -XX: + UseStringDeduplication: Java 8u20 je uveo ovaj JVM parametar za smanjenje nepotrebne upotrebe memorije stvaranjem previše primjeraka iste Niz; ovo optimizira hrpu memorije smanjenjem duplikata Niz vrijednosti u jedan globalni niz char []
  • -XX: + KoristiLWPSsinkronizaciju: skupovi LWP (Lagan postupak) Na temelju politike sinkronizacije umjesto sinkronizacije temeljene na nitima
  • -XX: LargePageSizeInBytes: postavlja veliku veličinu stranice koja se koristi za Java gomilu; uzima argument u GB / MB / KB; s većim veličinama stranica možemo bolje iskoristiti hardverske resurse virtualne memorije; međutim, to može uzrokovati veće veličine prostora za PermGen, što zauzvrat može prisiliti na smanjenje veličine Java gomile prostora
  • -XX: MaxHeapFreeRatio: postavlja maksimalni postotak hrpe bez GC kako bi se izbjeglo skupljanje.
  • -XX: MinHeapFreeRatio: postavlja minimalni postotak hrpe bez GC kako bi se izbjeglo širenje; za praćenje upotrebe hrpe možete koristiti VisualVM isporučen s JDK.
  • -XX: Omjer preživjelih: Omjer Eden/veličina prostora za preživjele - na primjer, -XX: Omjer preživjelih = 6 postavlja omjer između svake prostor za preživjele i jedan prostor biti 1: 6,
  • -XX: + UseLargePages: koristite veliku memoriju stranica ako je sustav podržava; Imajte na umu da OpenJDK 7 teži padu ako se koristi ovaj JVM parametar

  • -XX: + UseStringCache: omogućuje predmemoriranje često dodijeljenih nizova dostupnih u Niz bazen

  • -XX: + UseCompressedStrings: koristi bajt[] tip za Niz objekti koji se mogu predstaviti u čistom ASCII formatu
  • -XX: + OptimizeStringConcat: optimizira Niz operacije spajanja gdje je to moguće

8. Zaključak

U ovom kratkom članku saznali smo o nekim važnim JVM parametrima - koji se mogu koristiti za podešavanje i poboljšanje općih performansi aplikacije.

Neki od njih mogu se koristiti i u svrhe otklanjanja pogrešaka.

Ako želite detaljnije istražiti referentne parametre, ovdje možete započeti.