Permgen vs Metaspace i Java

1. Introduktion

I denne hurtige vejledning vi skal undersøge forskellene mellem PermGen og Metaspace-hukommelsesregionerne i Java-miljøet.

Det er vigtigt at huske på, at Metaspace, der starter med Java 8, erstatter PermGen - hvilket medfører nogle væsentlige ændringer.

2. PermGen

PermGen (Permanent Generation) er et specielt bunkeområde adskilt fra hovedhukommelsesbunken.

JVM holder styr på indlæst klassemetadata i PermGen. Derudover gemmer JVM alt det statiske indhold i denne hukommelsesafdeling. Dette inkluderer alle de statiske metoder, primitive variabler og henvisninger til de statiske objekter.

Desuden, den indeholder data om bytecode, navne og JIT-oplysninger. Før Java 7 var String Pool også en del af denne hukommelse. Ulemperne ved den faste poolstørrelse er angivet i vores opskrivning.

Standard maksimal hukommelsesstørrelse for 32-bit JVM er 64 MB og 82 MB for 64-bit versionen.

Vi kan dog ændre standardstørrelsen med JVM-indstillingerne:

  • -XX: PermSize = [størrelse] er den oprindelige eller mindste størrelse af PermGen-rummet
  • -XX: MaxPermSize = [størrelse] er den maksimale størrelse

Mest vigtigt, Oracle fjernede fuldstændigt dette hukommelsesrum i JDK 8-udgivelsen. Derfor, hvis vi bruger disse tuningflag i Java 8 og nyere versioner, får vi følgende advarsler:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m -version OpenJDK 64-bit Server VM advarsel: Ignorer indstilling PermSize; support blev fjernet i 8.0 OpenJDK 64-bit Server VM advarsel: Ignorer indstilling MaxPermSize; support blev fjernet i 8.0 ...

Med sin begrænsede hukommelsesstørrelse er PermGen involveret i at generere den berømte OutOfMemoryError. Kort sagt, klasselæsserne blev ikke affald opsamlet ordentligt og som et resultat genereret en hukommelseslækage.

Derfor modtager vi en hukommelsespladsfejl; dette sker for det meste i udviklingsmiljøet, mens der oprettes nye klasselæssere.

3. Metaspace

Kort sagt, Metaspace er et nyt hukommelsesrum - startende fra Java 8-versionen; det har erstattet det ældre PermGen-hukommelsesrum. Den mest betydningsfulde forskel er, hvordan den håndterer hukommelsestildeling.

Specifikt denne oprindelige hukommelsesregion vokser automatisk som standard.

Vi har også nye flag til at tune hukommelsen:

  • MetaspaceSize og MaxMetaspaceSize - vi kan indstille Metaspace øvre grænser.
  • MinMetaspaceFreeRatio - er den mindste procentdel af klassens metadata kapacitet fri efter affaldsindsamling
  • MaxMetaspaceFreeRatio - er den maksimale procentdel af klassens metadata kapacitet fri efter en affaldsindsamling for at undgå en reduktion i mængden af ​​plads

Derudover opnår affaldsindsamlingsprocessen også nogle fordele ved denne ændring. Affaldssamleren udløser nu automatisk rensning af de døde klasser, når klassens metadataforbrug når sin maksimale metaspace-størrelse.

Derfor, med denne forbedring reducerer JVM chancen for at få Ikke mere hukommelse fejl.

På trods af alle disse forbedringer er vi stadig nødt til at overvåge og indstille metaspace for at undgå hukommelseslækage.

4. Resume

I denne hurtige opskrivning præsenterede vi en kort beskrivelse af hukommelsesregionerne PermGen og Metaspace. Derudover forklarede vi de vigtigste forskelle mellem hver af dem.

PermGen findes stadig med JDK 7 og ældre versioner, men Metaspace tilbyder mere fleksibel og pålidelig hukommelsesforbrug til vores applikationer.


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