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.