Java Memorie: Heap spațiu și gunoier

Aflați mai multe despre modul în care Java gestionează memorie prin spațiu heap și de colectare a gunoiului. Înțelegerea de alocare de memorie poate ajuta la evitarea scurgeri de memorie în programele Java.

A+ A-

Recent, am scris o aplicație Java care, atunci când executați, necesită destul de un pic de memorie și am început pentru a obține eroarea de OutOfMemory:

 Eroare: java.lang.OutOfMemoryError: Java spațiu heap 

Acest lucru se întâmplă de multe ori, atunci când avem nevoie pentru a rula programe-pileala de memorie. În urma sunt câteva modalități de a rezolva astfel de probleme.

Ce este Java spațiu grămadă?

În primul rând, vă permite să înțeleagă ce este spațiul heap. Ei bine, Java utilizează memoria în principal în aranjamentele de heap si stiva . Java păstrează parametrii care sunt transmise de la o metodă de chemare la o metodă numită , sub forma unei structuri de stivă ( de exemplu , parametrii sunt împinse și mi -a venit din stivă ca pe nevoia). Pe de altă parte, heap este un spațiu de memorie accesat în mod aleatoriu în cazul în care Java creează și păstrează obiecte. Java creează obiectul în acest spațiu morman ori de câte ori se constată suficient pentru a conține obiectul camerei. Deci, atunci când creați un obiect nou ( de exemplu , noul String () ;) obiectul devine creat în spațiul heap și ocupă memoria pe care se poate potrivi în. În timpul colectării gunoiului, Java eliberează spațiul heap acelor obiecte care nu se mai face referire. Dar, în cazul în care numărul de referință (de exemplu, „necesară“), obiectele continuă creștere, iar noi nu le deferență -ORAȘUL JVM se execută în afara spațiului heap.

Cantitatea de memorie pe care o clasă ar avea nevoie depinde de numărul și tipul membrilor săi de date.

  1. Clasa în sine necesită minim de 8 octeți
  2. Fiecare membru de date necesită 4 octeți (lungime și dublu nevoie de 8 biți). Chiar și o variabilă booleană este folosi 4 octeți, deși este nevoie de un singur bit pentru a obține stocate.
  3. Cantitatea de memorie folosită crește în bucăți de 8 octeți
Optimizați programele Java

Primul pas pentru a obține în jurul valorii de această problemă ar trebui să treacă prin program și a vedea cum ar putea fi modificat, astfel încât să-l folosească de memorie mai mică. Din moment ce mult timp costul de memorie a fost extrem de scăzută în comparație cu ceea ce a fost în timpul anilor 1960. Iar programatorii au devenit destul de extravagante în ceea ce privește alocația de memorie pentru programele lor. Cu toate acestea încă, cel mai adesea, avem nevoie pentru a scrie programe care necesită mai multă memorie decât disponibilă. Frugalitate în contextul utilizării memoriei este întotdeauna bun, deoarece nu numai că reduce șansele de accident de program, dar, de asemenea, uneori, se îmbunătățește viteza de execuție.

Ar trebui să setați obiecte să fie nul , atunci când nu mai sunt necesare în cod. Acest lucru este cu atât mai important dacă se execută o buclă în care creați obiect (e), dar apoi nu le aruncați atunci când acestea nu sunt necesare.

Asigurați-utilizarea de Java metoda colector de gunoi

Al doilea pas spre optimizarea utilizării memoriei ar putea fi invocați în mod explicit metoda de colectare a gunoiului. Java solicită în mod automat această metodă ca și atunci când este necesar și eliberează spațiul de memorie care conține obiecte care nu mai sunt menționate. Dar puteți apela, de asemenea, această metodă în mod explicit în cod (de exemplu, după o „sarcină mare“ este realizată și următoare de „sarcina mare“ este pe cale să înceapă). Pentru a apela colectorul de gunoi, folosiți:

 Runtime.getRuntime () gc (.); 

Puteți monitoriza starea memoriei înainte și după gc) metoda (se numește.

 System.out.println ( "nnCalling Garbage Collectornn");
System.out.println ( "Memorie liberă înainte de:" + Runtime.getRuntime () freeMemory ().);
Runtime.getRuntime () gc (.);
System.out.println ( "memorie liberă:". + Runtime.getRuntime () freeMemory ());
System.out.println ( "nnGarbage colectare finishednn"); 

freememory metoda () returnează cantitatea de memorie liberă disponibilă măsurată în octeți. Pentru alte metode oferite de clasa runtime Java API

Dă mai multă memorie pentru JVM

Eforturile pentru utilizarea memoriei de optimizare fără a aduce atingere, uneori, JVM într-adevăr, are nevoie de mai multă memorie. În astfel de cazuri, putem spune JVM prin linia de comandă pentru a utiliza o anumită sumă de memorie:

 java -Xms2000m -Xmx3500m 

-Xms și -Xmx comută specifica cantitatea de spațiu de swap ( de memorie virtuală) care JVM poate utiliza în mașină.

-Xms specifică minimă (adică inițial) cantitatea de memorie

-Xmx specifică cantitatea maximă de memorie pe care JVM ar putea folosi.

Aceste valori de memorie trebuie să fie specificate în megaocteți.

Deci, aceasta a fost despre Java gestionează de memorie prin spațiu heap și mecanismul de colectare a gunoiului. Acestea sunt alegeri inteligente și fiecare programator Java ar trebui să aibă o înțelegere clară a modului în care Java se ocupă de memorie. Numai tu vei fi capabil să lucreze eficient pe programe intensive de memorie.

Ads

Acțiune