OutOfMemoryError: Premašeno je ograničenje GC-a iznad troškova

1. Pregled

Jednostavno rečeno, JVM se brine za oslobađanje memorije kada se objekti više ne koriste; taj se postupak naziva Skupljanje smeća (GC).

The Prekoračeno gornje ograničenje GC-a greška je jedna iz obitelji java.lang.OutOfMemoryError i pokazatelj je iscrpljenosti resursa (memorije).

U ovom ćemo kratkom članku pogledati što uzrokuje java.lang.OutOfMemoryError: prekoračeno ograničenje GC-a iznad troškova pogreška i kako se može riješiti.

2. Premašena je pogreška GC gornjeg ograničenja

OutOfMemoryError je podrazred od java.lang.VirtualMachineError; baca ga JVM kad naiđe na problem povezan s korištenjem resursa. Točnije, pogreška se događa kada je JVM proveo previše vremena izvodeći odvoz smeća i uspio je povratiti vrlo malo prostora za hrpu.

Prema Java dokumentima, JVM je prema zadanim postavkama konfiguriran za uklanjanje ove pogreške ako Java proces provodi više od 98% svog vremena radeći GC i kada se u svakom izvođenju obnovi manje od 2% hrpe. Drugim riječima, to znači da je naša aplikacija potrošila gotovo svu raspoloživu memoriju, a Sakupljač smeća previše je vremena pokušavao očistiti i više puta nije uspio.

U ovoj situaciji korisnici doživljavaju krajnju sporost aplikacije. Određenim operacijama, koje se obično dovrše u milisekundama, treba više vremena da se dovrše. To je zato što CPU koristi cjelokupni kapacitet za odvoz smeća i stoga ne može izvoditi nikakve druge zadatke.

3. Pogreška u akciji

Pogledajmo dio koda koji baca java.lang.OutOfMemoryError: prekoračeno ograničenje GC-a iznad troškova.

To možemo postići, na primjer, dodavanjem parova ključ / vrijednost u nedodijeljenu petlju:

javna klasa OutOfMemoryGCLimitExceed {javna statička praznina addRandomDataToMap () {Map dataMap = new HashMap (); Random r = novi Random (); while (true) {dataMap.put (r.nextInt (), String.valueOf (r.nextInt ())); }}}

Kada se ova metoda pozove, s JVM argumentima kao -Xmx100m -XX: + UseParallelGC (Veličina hrpe Java postavljena je na 100 MB, a GC algoritam je ParallelGC), dobivamo java.lang.OutOfMemoryError: prekoračeno ograničenje GC-a iznad troškova pogreška. Da bismo bolje razumjeli različite algoritme sakupljanja smeća, možemo provjeriti Oracleov vodič za osnove prikupljanja smeća Java.

Dobit ćemo java.lang.OutOfMemoryError: prekoračeno ograničenje GC-a iznad troškova pogreška vrlo brzo pokretanjem sljedeće naredbe iz korijena projekta:

mvn izvršni: izvršni

Također treba napomenuti da bismo u nekim situacijama mogli naići na pogrešku prostora hrpe prije nego što naiđemo na Prekoračeno gornje ograničenje GC-a pogreška.

4. Rješavanje prekoračene pogreške GC overhead limit-a

Idealno rješenje je pronaći osnovni problem s aplikacijom ispitivanjem koda za curenje memorije.

Treba riješiti sljedeća pitanja:

  • Koji su objekti u aplikaciji koji zauzimaju velike dijelove hrpe?
  • U kojim se dijelovima izvornog koda dodjeljuju ti objekti?

Također možemo koristiti automatizirane grafičke alate poput JConsole koji pomaže u otkrivanju problema s performansama u kodu, uključujući java.lang.OutOfMemoryErrors.

Posljednje sredstvo bilo bi povećanje veličine hrpe promjenom konfiguracije pokretanja JVM-a. Na primjer, ovo daje 1 GB prostora za hrpu za Java aplikaciju:

java -Xmx1024m com.xyz.TheClassName

Međutim, to neće riješiti problem ako u stvarnom kodu aplikacije dođe do curenja memorije. Umjesto toga, samo ćemo odgoditi pogrešku. Stoga je uputnije temeljito ponovno procijeniti upotrebu memorije aplikacije.

5. Zaključak

U ovom vodiču ispitali smo java.lang.OutOfMemoryError: prekoračeno ograničenje GC-a iznad troškova i razlozi koji stoje iza toga.

Kao i uvijek, izvorni kod povezan s ovim člankom možete pronaći na GitHubu.