Java Heap Space Memory med Runtime API

1. Oversigt

I denne artikel vil vi diskutere de API'er, der leveres af Java, der kan hjælpe os med at forstå de forskellige aspekter relateret til Java-bunkerum.

Dette kan være nyttigt til at forstå JVM's nuværende hukommelsesstatus og outsource den til overvågningstjenester som StatsD og Datadog, som derefter kan konfigureres til at træffe forebyggende handlinger og undgå applikationsfejl.

2. Adgang til hukommelsesparametre

Hver Java-applikation har en enkelt forekomst af java.lang.Runtime der kan hjælpe os med at forstå applikationens aktuelle hukommelsesstatus. Det Runtime # getRuntime statisk metode kan kaldes for at få singleton Kørselstid eksempel.

2.1. Total hukommelse

Det Kørselstid # getTotalMemory metode returnerer det samlede bunkeområde, der i øjeblikket er reserveret af JVM i byte. Den inkluderer hukommelsen reserveret til aktuelle og fremtidige objekter. Derfor er det ikke garanteret at være konstant under programudførelsen, da Java-bunkerummet kan udvides eller reduceres, efterhånden som flere objekter tildeles.

Også, denne værdi er ikke nødvendigvis, hvad der er i brug, eller den maksimale tilgængelige hukommelse.

2.2. Gratis hukommelse

Det Runtime # freeMemory metoden returnerer den ledige bunkeplads, der er tilgængelig til nye objektallokeringer i byte. Det kan øges som et resultat af en skraldopsamlingsoperation, hvor mere ledig hukommelse er tilgængelig efter.

2.3. Maksimal hukommelse

Det Runtime # maxMemory metode returnerer den maksimale hukommelse, som JVM vil forsøge at bruge. Når JVM-hukommelsesforbruget når denne værdi, tildeler det ikke mere hukommelse og i stedet, og det vil affaldssamling oftere.

Hvis JVM-objekter stadig har brug for mere hukommelse, selv efter affaldssamleren er kørt, kan JVM muligvis kaste et java.lang.OutOfMemoryError undtagelse for runtime.

3. Eksempel

I nedenstående eksempel initialiserer vi en ArrayList og tilføj elementer til det, mens du holder styr på JVM-bunkerummet ved hjælp af ovenstående tre metoder:

ArrayList arrayList = ny ArrayList (); System.out.println ("i \ t fri hukommelse \ t total hukommelse \ t maks. Hukommelse"); for (int i = 0; i <1000000; i ++) {arrayList.add (i); System.out.println (i + "\ t" + Runtime.getRuntime (). FreeMemory () + "\ t \ t" + Runtime.getRuntime (). TotalMemory () + "\ t \ t" + Runtime.getRuntime () .maxMemory ()); } // ...
Output: Jeg Fri Hukommelse Total hukommelse Max Memory 0 254741016 257425408 3817865216 1 254741016 257425408 3817865216 ... 1498 254741016 257425408 3817865216 1499 253398840 257425408 3817865216 1500 253398840 257425408 3817865216 ... 900079 179608120 260046848 3817865216 900080 302140152 324534272 3817865216 900081 302140152 324534272 3817865216 ...
  • Række 1498: The Runtime # freeMemory værdien falder, når der tildeles nok objekter i Java-bunken.
  • Række 900080: På dette tidspunkt har JVM mere plads til rådighed, da GC har kørt, derfor værdierne for Runtime # freeMemory og Runtime # totalMemory øge.

Værdierne vist ovenfor forventes at være forskellige på hver kørsel af en Java-applikation.

4. Tilpasning af hukommelsesparametre

Vi kan tilsidesætte standardværdierne for JVM-hukommelsesparametrene ved at indstille brugerdefinerede værdier til visse flag, når vi kører vores Java-program for at opnå den krævede hukommelsesydelse:

  • -Xms: Den værdi, der er tildelt -Xms flag indstiller start- og minimumsværdien af ​​Java-bunken. Det kan bruges i tilfælde, hvor vores applikation kræver mere hukommelse end standardminimumet, når JVM startes
  • -Xmx: På samme måde kan vi indstille den maksimale værdi for bunkepladsen ved at tildele den til -Xmx flag. Det kan bruges, når vi med vilje vil begrænse den mængde hukommelse, som vores applikation bruger.

Bemærk også, at -Xms værdien skal være lig med eller mindre end -Xmx værdi.

4.1. Anvendelse

java -Xms32M -Xmx64M Hovedfri hukommelse: 31792664 bytes Total hukommelse: 32505856 byte Maks hukommelse: 59768832 byte java -Xms64M -Xmx64M Hovedfri hukommelse: 63480640 bytes Total hukommelse: 64487424 bytes Maks. hukommelse: 64487424 byte java -Xms64M -Xmx32 under initialisering af VM Indledende bunke størrelse indstillet til en større værdi end den maksimale bunke størrelse

5. Konklusion

I denne artikel har vi set, hvordan man henter JVM-hukommelsesmålinger via Kørselstid klasse. Disse metoder kan være nyttige, når man undersøger JVM-hukommelseslækager og andre problemer med JVM-hukommelsesydelse.

Vi har også vist, hvordan man tildeler brugerdefinerede værdier til visse flag, der fører til forskellige JVM-hukommelsesadfærd i forskellige scenarier.


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