Cum să se ocupe cu "java.lang.OutOfMemoryError: Java grămadă de spațiu" eroare?

Am scris un client-side Leagăn cerere (grafic designer de font) pe Java 5. Recent, eu sunt difuzate în java.lang.OutOfMemoryError: Java grămadă de spațiu de eroare deoarece nu sunt conservatoare pe utilizarea memoriei. Utilizatorul poate deschide un număr nelimitat de fișiere, și programul păstrează deschise obiecte în memorie. După o scurtă cercetare am găsit Ergonomie în 5.0 Java Virtual Machine, iar alții că pe Windows mașină JVM implicite max heap de dimensiune ca 64MB.

Având în vedere această situație, cum ar trebui să am de-a face cu această constrângere?

Am putea crește max dimensiunea heap folosind în linia de comandă opțiunea de a java, dar care ar avea nevoie de imaginind RAM disponibil și scris unele lansare program sau script. În plus, creșterea la unele finit max nu în cele din urmă scapa de problema.

Am putea rescrie o parte din codul meu de a persista obiecte pentru sistemul de fișiere frecvent (folosind baza de date este același lucru) pentru a elibera memoria. S-ar putea lucra, dar's, probabil, o mulțime de muncă prea.

Dacă ai putea să-mi punctul de detalii de ideile de mai sus sau unele alternative, cum ar fi automată de memorie virtuală, extinderea dimensiunea heap dinamic, care va fi mare.

Comentarii la întrebare (2)
Soluția

În cele din urmă, veți avea întotdeauna o mulțime finită max de lucru pentru a folosi indiferent de ceea ce platforma se execută pe. În Windows pe 32 de biți este în jurul 2GB` (nu în mod special heap dar cantitatea totală de memorie pentru fiecare proces). Ea doar se întâmplă că Java alege pentru a face implicit mai mic (se presupune că programatorul poate't de a crea programe care au fugit de alocare de memorie fără a executa în această problemă și să mai examineze exact ceea ce fac).

Deci, acest lucru având în vedere că sunt mai multe abordări ai putea lua nici pentru a determina ce cantitate de memorie ai nevoie sau pentru a reduce cantitatea de memorie pe care îl utilizați. O greșeală comună cu gunoi colectate limbi, cum ar fi Java sau C# este de a menține în jurul valorii de referințe la obiecte pe care le nu mai utilizați, sau alocarea multe obiecte atunci când ai putea reutilizare le în loc. Atâta timp cât obiectele au o referință pentru ei, va continua să folosească heap spațiul ca gunoier nu le va șterge.

În acest caz, puteți folosi un Java memorie profiler pentru a determina ce metode în program se alocă număr mare de obiecte și apoi să determine dacă există o modalitate de a face sigur că ei nu mai sunt referite, sau să nu le aloce în primul rând. O opțiune care trebuie utilizată în trecut, este "JMP" http://www.khelekore.org/jmp/.

Dacă determinați că ești alocarea acestor obiecte pentru un motiv și aveți nevoie pentru a păstra în jurul valorii de referințe (în funcție de ce faci acest lucru ar putea fi cazul), va trebui doar pentru a crește max heap de dimensiune atunci când începe programul. Cu toate acestea, odată ce ați face memoria de profilare și de a înțelege cum obiectele devin alocate ar trebui să aveți o idee mai bună despre cât de mult de memorie ai nevoie.

În general, dacă poți't garanta că programul va rula în unele finit cantitatea de memorie (probabil în funcție de mărimea de intrare) va rula întotdeauna în această problemă. Numai după epuizarea tuturor de acest lucru aveți nevoie să se uite în cache obiecte pentru a disc etc. În acest moment ar trebui să ai un motiv foarte bun de a spune "am nevoie de Xgb de memorie" pentru ceva și nu poți't de lucru în jurul valorii de ea prin îmbunătățirea algoritmilor sau alocare de memorie modele. În general, acest lucru va fi, de obicei cazul pentru algoritmi de operare pe seturi mari de date (cum ar fi o bază de date sau a unor analize științifice program) și apoi tehnici cum ar fi cache și memorie mapate IO deveni utile.

Comentarii (1)

Rula Java cu opțiunea de linie de comandă -Xmx, care stabilește maxim dimensiunea heap.

A se vedea aici pentru detalii.

Comentarii (3)

Ai putea specifica pe proiect de cât de mult spațiu grămadă proiectul dumneavoastră vrea

Următoarele este pentru Eclipse Helios/Juno/Kepler:

Click dreapta pe

 Run As - Run Configuration - Arguments - Vm Arguments, 

apoi se adaugă acest

-Xmx2048m
Comentarii (2)

Creșterea dimensiunea heap nu este o "repara" este un "ipsos", 100% temporar. Se va prăbuși din nou în altă parte. Pentru a evita aceste probleme, scrie înaltă performanță cod.

  1. Folosi variabile locale, acolo unde este posibil.
  2. Asigurați-vă că selectați obiectul corect (EX: Selectarea între String, StringBuffer și StringBuilder)
  3. A folosi un bun sistem de cod pentru programul dvs.(EX: Utilizarea variabilelor statice VS non variabile statice)
  4. Alte chestii care ar putea lucra pe codul.
  5. Încercați să se mute cu multy FILETARE
Comentarii (3)

Avertisment mare ---- la biroul meu, am fost constatarea că (pe unele mașini windows) nu am putut aloca mai mult de 512mb pentru Java heap. Acest lucru s-a dovedit a fi din cauza Kaspersky anti-virus produs instalat pe unele dintre aceste masini. După dezinstalarea că AV produs, am descoperit că putem aloca cel puțin 1,6 gb, am.e, -Xmx1600m (m este obligatorie, altfel se va duce la un alt eroare "Prea inițială mică heap") funcționează.

Nu știu dacă acest lucru se întâmplă cu alte produse AV dar probabil acest lucru se întâmplă deoarece AV program este rezervarea unui mic bloc de memorie în fiecare spațiu de adrese, prevenind astfel un singur mare alocare.

Comentarii (0)

VM argumente lucrat pentru mine în eclipsă. Dacă sunteți folosind eclipse versiunea 3.4, efectuați următoarele

du-te la Run --> Run Configurații --> apoi selectați proiectul în maven construi --> apoi selectați fila "JRE" --> apoi introduceți-Xmx1024m`.

Alternativ, ai putea să faci pentru a Rula --> Run Configurații --> selectați "JRE" fila -->apoi introduceți -Xmx1024m`

Acest lucru ar trebui să crească de memorie heap pentru toate construiește/proiecte. Cele de mai sus dimensiunea memoriei este de 1 GB. Puteți optimiza modul în care doriți.

Comentarii (0)

Da, cu `-Xmx puteți configura mai mult de memorie pentru JVM. Pentru a fi sigur că don't scurgere sau pierdere de memorie. Ia-o grămadă de gunoi și de a folosi Eclipsa de Memorie Analizor pentru a analiza consumul de memorie.

Comentarii (1)

Aș dori să adaug recomandări de la oracle probleme de fotografiere art.

Excepție în fir thread_name: java.lang.OutOfMemoryError: Java grămadă de spațiu

detalii mesaj Java grămadă de spațiu indică obiectul nu ar putea fi alocate în heap Java. Această eroare nu implică neapărat o scurgere de memorie

Cauze posibile:

  1. Configurare simplă problemă, în cazul în care se specifică dimensiunea heap este insuficientă pentru aplicarea.

  2. Cererea este în mod neintenționat deține referințe la obiecte, iar acest lucru previne obiecte de gunoi colectate.

  3. Utilizarea excesivă a finalizers.

O altă sursă potențială de această eroare apare cu aplicații care fac utilizarea excesivă a finalizers. Dacă o clasă are o finaliza metoda, apoi obiecte de acest tip nu au spațiul lor de recuperat de la colectarea gunoiului timp

După colectarea gunoiului, obiectele sunt plasate în coada de așteptare pentru finalizarea, care apare la un moment ulterior. finalizers sunt executate de un daemon fir care serviciile finalizarea coadă. Dacă finalizer fir nu poate ține pasul cu finalizarea coadă, apoi Java heap-ar putea umple și acest tip de OutOfMemoryError excepție ar fi aruncat.

Un scenariu care poate provoca această situație este atunci când o aplicație care creează de înaltă prioritate fire care determina finalizarea coadă pentru a crește la o rată care este mai rapid decât rata la care finalizer firul este service coadă.

Comentarii (0)

Urmați pașii de mai jos:

  1. Deschide `catalina.sh de tomcat/bin.

  2. Schimba JAVA_OPTS să

JAVA_OPTS="-Djava.awt.fără cap=true -Dfile.codificare=UTF-8 -server-Xms1536m -Xmx1536m -XX:Dimnouă=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

  1. Reporniți tomcat
Comentarii (0)

M-am confruntat cu aceeasi problema de java dimensiunea heap.

Am două soluții dacă sunteți folosind java 5(1.5).

  1. trebuie doar să instalați jdk1.6 și du-te la preferințele de eclipse și setați jre calea de jav1 1.6 cât aveți instalat.

  2. Verificați CA argument și lăsați-l să fie ceea ce este. trebuie doar să adăugați o linie mai jos de toate argumentele prezente în VM argumente ca -Xms512m -Xmx512m -XX:MaxPermSize=...m(192 de milioane).

Cred ca va merge...

Comentarii (0)

Dacă aveți nevoie pentru a monitoriza utilizarea memoriei la runtime, java.lang.de gestionare a pachetului de oferte MBeans, care poate fi folosit pentru a monitoriza de memorie piscine în VM (de exemplu, eden spațiu, titular generație etc), și, de asemenea, de colectare a gunoiului de comportament.

Gratuit spațiu grămadă raportate de către aceste MBeans va varia foarte mult în funcție de GC comportament, în special dacă aplicația generează o mulțime de obiecte care sunt mai târziu GC-ed. O abordare posibilă este de a monitoriza gratuit grămadă de spațiu după fiecare full-GC, care s-ar putea fi capabil de a utiliza pentru a face o decizie privind eliberarea de memorie de obiecte persistente.

În cele din urmă, cel mai bun pariu este de a limita de retenție de memorie, pe cât posibil, în timp ce performanța rămâne acceptabilă. Ca un comentariu anterior menționat, de memorie este întotdeauna limitat, dar aplicația ar trebui să aibă o strategie de-a face cu memoria epuizare.

Comentarii (0)

Am citit undeva că poți try - catch java.lang.OutOfMemoryError și pe bloc catch, puteți elibera toate resursele de care știți că s-ar putea folosi o mulțime de memorie, închideți conexiunile și așa mai departe, apoi face un Sistem.gc()` apoi re-încerca orice ai de gând să faci.

O altă modalitate este acest lucru, deși, eu nu't știu dacă acest lucru ar lucra, dar eu sunt în prezent de testare dacă se va lucra pe cererea mea.

Ideea este de a face colectarea Gunoiului de asteptare Sistem.gc (), care este cunoscut pentru a crește de memorie gratuit. Puteți păstra verificarea asta după o memorie inghitit executa codul.


//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()
Comentarii (2)

Modalitate ușoară de a rezolva OutOfMemoryError în java este de a crește dimensiunea maximă heap prin utilizarea JVM opțiuni -Xmx512M, acest lucru va rezolva imediat tău OutOfMemoryError. Acest lucru este meu preferat soluție atunci când am obține OutOfMemoryError în Eclipse, Maven sau FURNICĂ în timp ce construirea de proiect, deoarece, în funcție de dimensiunea de proiect, puteți cu ușurință fugit de Memorie.

Aici este un exemplu de creștere maximă dimensiunea heap de JVM, de Asemenea, este mai bine să păstrați -Xmx să -Xms rație de 1:1 sau 1:1,5 dacă sunteți setarea dimensiunii heap în aplicații java.

export JVM_ARGS="-Xms1024m -Xmx1024m"`

Link-Ul De Referință

Comentarii (1)

În mod implicit pentru dezvoltarea JVM folosește de dimensiuni mici și mici config pentru alte legate de performanță caracteristici. Dar pentru producția puteți regla, de exemplu (În plus că Serverul de Aplicații specifice config poate exista) -> (Dacă încă nu't de memorie suficientă pentru a satisface cererea și heap a ajuns deja la dimensiunea maximă, o OutOfMemoryError va avea loc)

-Xms        set initial Java heap size
-Xmx        set maximum Java heap size
-Xss        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)

De exemplu: Pe Platforma linux pentru modul de producție de preferat setări.

După descărcarea și configurarea server cu acest mod http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/

1.crea setenv.sh fișierul în folderul /opt/tomcat/bin/

   touch /opt/tomcat/bin/setenv.sh

2.Deschide și de a scrie acest params pentru stabilirea de preferat modul.

nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"
  1. serviciul tomcat restart`

Rețineți că JVM utilizează mai multă memorie decât doar heap. De exemplu Java metode, fir stive și nativ mânerele sunt alocate în memorie separat de heap, precum și JVM structurile de date interne.

Comentarii (0)

Rețineți că, dacă aveți nevoie de acest lucru într-o implementare situație, luați în considerare utilizarea Java WebStart (cu o "ondisk" versiune, nu de rețea o - posibil în Java 6u10 și mai târziu), deoarece vă permite să specificați mai multe argumente pentru a JVM într-un cross-platform de drum.

În caz contrar, veți avea nevoie de un sistem de operare specific launcher care stabilește argumentele de care ai nevoie.

Comentarii (1)

Cu privire la netbeans, ai putea seta max heap de dimensiune pentru a rezolva problema.

Du-te la 'Run', apoi - > 'Set de Configurare a Proiectului' --> 'Personaliza' --> 'run' din cele apărut fereastra --> 'VM Opțiune' --> umple '-Xms2048m -Xmx2048m'.

Comentarii (0)

Dacă această problemă se întâmplă în Wildfly 8 și JDK1.8,atunci avem nevoie pentru a specifica MaxMetaSpace setările în loc de PermGen setări.

De exemplu, avem nevoie pentru a adăuga mai jos de configurare în setenv.sh dosarul de wildfly. JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"

Pentru mai multe informații, vă rugăm să verificați Wildfly Heap Problema

Comentarii (0)

Dacă vă păstrați pe alocarea & păstrarea referințe la obiect, va umple orice cantitate de memorie ai.

O opțiune este de a face un fișier transparent aproape & deschide atunci când se comuta file (ai păstra doar un pointer la fișier, și atunci când utilizatorul trece tab, ai aproape & curăța toate obiectele... l'll face fișierul schimba mai lent... dar...), și poate păstra doar 3 sau 4 fișiere de pe memoria.

Alt lucru pe care ar trebui să facă este, atunci când utilizatorul deschide un fișier, încărcați-l, și de a intercepta orice OutOfMemoryError, atunci (deoarece nu este posibil să deschideți fișierul) închide fișierul, curat obiectele sale și avertizează utilizatorul că el ar trebui să închidă fișierele neutilizate.

Ideea ta de dinamic extinderea memoriei virtuale nu't rezolva problema, pentru ca aparatul este limitat la resurse, așa că ar trebui să fie atent & se ocupe de probleme de memorie (sau, cel puțin, să fie atent cu ei).

Câteva indicii i'am văzut cu pierderi de memorie este:

--> Țineți minte că, dacă ai pus ceva într-o colecție și apoi uita despre asta, tu încă mai au o puternică referință la acesta, astfel încât anula colectare, curățați-l sau de a face ceva cu ea... dacă nu veți găsi o scurgere de memorie dificil de a găsi.

--> Poate, folosind colecții cu referințe slabe (weakhashmap...) poate ajuta cu probleme de memorie, dar tu trebuie să fie atent cu ea, pentru ca s-ar putea găsi că obiectul cauți au fost colectate.

--> o Alta idee pe care am'am găsit este de a dezvolta un persistentă colecție care stocate în baza de date de obiecte mai puțin utilizate și transparent încărcate. Acest lucru ar fi, probabil, cea mai bună abordare...

Comentarii (0)