Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: OutOfMemoryError: GC overhead limit exceeded

LCHawk [21.07.2016 13:47:52]

#

Ohjelma antaa tuon ko. virheilmoituksen, kun lisään dataa ArrayList<String>-tietorakenteeseen. Ohjelma, jossa tämä tulee lukee dataa tekstitiedostoista ja sitten yhdistelee ja lajittelee tämän datan. Ko. data tullaan sitten kirjoittamaan tekstitiedostoon ko. ArrayListista ja siirtämään edelleen R-ohjelmaan. Olen googlaillut tuota ja tuntuu jotenkin ainakin tämän perusteella liittyvän jotenkin roskienkeräämiseen.

Miten tuosta pääsisi eroon?

fergusq [21.07.2016 14:37:32]

#

Voit kokeilla lisätä muistin määrää (muistaakseni lipulla -Xmx tjsp.). Näin sanotaana Oraclen sivuilla:

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html:

Exception in thread thread_name: java.lang.OutOfMemoryError: GC Overhead limit exceeded

Cause: The detail message "GC overhead limit exceeded" indicates that the garbage collector is running all the time and Java program is making very slow progress. After a garbage collection, if the Java process is spending more than approximately 98% of its time doing garbage collection and if it is recovering less than 2% of the heap and has been doing so far the last 5 (compile time constant) consecutive garbage collections, then a java.lang.OutOfMemoryError is thrown. This exception is typically thrown because the amount of live data barely fits into the Java heap having little free space for new allocations.

Action: Increase the heap size. The java.lang.OutOfMemoryError exception for GC Overhead limit exceeded can be turned off with the command line flag -XX:-UseGCOverheadLimit.

LCHawk [21.07.2016 16:15:07]

#

fergusq kirjoitti:

(21.07.2016 14:37:32): Voit kokeilla lisätä muistin määrää...

Tein tämän mukaan. Sain seuraavan virheilmoituksen:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
	at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
	at java.lang.AbstractStringBuilder.append(Unknown Source)
	at java.lang.StringBuilder.append(Unknown Source)

Lisäys: En tiedä, laitoinko tuon tekstin -XX:-UseGCOverheadLimit oikeaan paikkaan. Toimin tämän ohjeen mukaan ja laitoin kohtaan Run->Run Configurations ja sieltä Arguments ja Program.

Metabolix [21.07.2016 16:51:27]

#

Lue sitten se ohje vielä uudestaan: laitoit nyt kyseisen virheilmoituksen pois päältä, joten saat toisenlaisen ilmoituksen. Varsinainen ratkaisu oli kuitenkin muistimäärän lisääminen -Xmx-lipulla, esim. -Xmx2048M. Jos koneesi muisti ei riitä, kannattaa miettiä datan käsittelyyn muita keinoja.

LCHawk [21.07.2016 16:57:58]

#

Testattu myös kohtaa VM Arguments

Metabolix kirjoitti:

(21.07.2016 16:51:27): Lue sitten se ohje vielä uudestaan: laitoit nyt...

Onko tässä jotain ylärajaa paljonko voi laittaa vai onko maksimi koneen muistin määrä?

Metabolix [21.07.2016 17:04:27]

#

Parametriksi sinänsä voi antaa isonkin luvun, mutta tietenkin käytännössä muisti silti aikanaan loppuu. Käytännön muistimäärää rajoittaa koneen keskusmuisti ja sivutustiedoston (page file, swap) koko.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta