Permgen vs Metaspace i Java

1. Introduksjon

I denne raske opplæringen, vi skal undersøke forskjellene mellom PermGen og Metaspace-minnesregionene i Java-miljøet.

Det er viktig å huske på at, fra og med Java 8, erstatter Metaspace PermGen - noe som medfører noen vesentlige endringer.

2. PermGen

PermGen (Permanent Generation) er en spesiell haugeplass atskilt fra hovedminnehaugen.

JVM holder rede på lastede klassemetadata i PermGen. I tillegg lagrer JVM alt det statiske innholdet i denne minneseksjonen. Dette inkluderer alle de statiske metodene, primitive variablene og referanser til de statiske objektene.

Dessuten, den inneholder data om bytekode, navn og JIT-informasjon. Før Java 7 var også String Pool en del av dette minnet. Ulempene med den faste bassengstørrelsen er oppført i oppskriften.

Standard maksimal minnestørrelse for 32-biters JVM er 64 MB og 82 MB for 64-biters versjonen.

Vi kan imidlertid endre standardstørrelsen med JVM-alternativene:

  • -XX: PermSize = [størrelse] er den første eller minste størrelsen på PermGen-rommet
  • -XX: MaxPermSize = [størrelse] er maksimal størrelse

Viktigst, Oracle fjernet dette minneområdet helt i JDK 8-utgivelsen. Derfor, hvis vi bruker disse innstillingsflaggene i Java 8 og nyere versjoner, får vi følgende advarsler:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m -versjon OpenJDK 64-biters server-VM-advarsel: Ignorer alternativet PermSize; støtte ble fjernet i 8.0 OpenJDK 64-biters server-VM-advarsel: Ignorer alternativet MaxPermSize; støtte ble fjernet i 8.0 ...

Med sin begrensede minnestørrelse er PermGen involvert i å generere den berømte OutOfMemoryError. Enkelt sagt var klasselasterne ikke søppel samlet riktig, og som et resultat genererte en minnelekkasje.

Derfor får vi en minneplassfeil; dette skjer mest i utviklingsmiljøet mens du lager nye klasselastere.

3. Metaspace

Enkelt sagt, Metaspace er et nytt minneområde - fra Java 8-versjonen; den har erstattet den eldre PermGen-minneplassen. Den viktigste forskjellen er hvordan den håndterer minnetildeling.

Nærmere bestemt, dette opprinnelige minneområdet vokser automatisk som standard.

Vi har også nye flagg for å stille inn minnet:

  • MetaspaceSize og MaxMetaspaceSize - vi kan sette Metaspace øvre grenser.
  • MinMetaspaceFreeRatio - er minimumsprosenten av klassens metadata kapasitet gratis etter søppeloppsamling
  • MaxMetaspaceFreeRatio - er den maksimale prosentandelen av klassens metadata kapasitet gratis etter en søppeloppsamling for å unngå en reduksjon i mengden plass

I tillegg får søppeloppsamlingsprosessen også noen fordeler med denne endringen. Søppeloppsamleren utløser nå automatisk rengjøring av de døde klassene når klassens metadatabruk når sin maksimale størrelse på metarom.

Derfor, med denne forbedringen reduserer JVM sjansen for å få Tomt for minne feil.

Til tross for alle disse forbedringene, må vi fremdeles overvåke og stille inn metaspace for å unngå minnelekkasjer.

4. Oppsummering

I denne raske oppskriften presenterte vi en kort beskrivelse av minneområdene PermGen og Metaspace. I tillegg forklarte vi de viktigste forskjellene mellom hver av dem.

PermGen er fortsatt tilgjengelig med JDK 7 og eldre versjoner, men Metaspace tilbyr mer fleksibel og pålitelig minnebruk for applikasjonene våre.