|
|
Postat pe 14.08.2017 16:49:22
|
|
|
|

Eroarea a apărut în timpul inițializării VM-ului Nu am putut rezerva suficient spațiu pentru un object heap de 3145728KB
Recent lucrez la un program pentru Java. Inițial, mi-a plăcut mereu gestionarea memoriei în Java, nu trebuie să-ți faci griji pentru alocarea memoriei, doar alocă, iar garbage-collector-ul va recupera memoria pentru tine. Acum programul este dezvoltat cu o cantitate mare de date, iar pentru viteză, voi încărca toate informațiile în memorie, ceea ce va asigura un răspuns rapid. Încă număr memoria în mod repetat, gândindu-mă la cantitatea mea de date, care ar trebui să fie suficientă la început (calculatorul meu are memorie 4G, deși Windows recunoaște 3,5G, dar ar trebui să fie în regulă comparativ cu volumul meu actual de date).
În mod neașteptat, programul primului experiment a rulat câteva ore și a întâlnit o Excepție Fără Memorie. Uitându-mă la setările mele VM, am setat -Xms512M -Xmx1024M. Fără să mă gândesc, am schimbat-o direct în -Xms512M -Xmx2048M, iar rezultatul a fost că nu am putut rezerva suficient spațiu pentru object heap. Programul nu se poate ridica. Abia atunci mi-am dat seama că încă exista o limită a memoriei maxime originale. Am căutat pe Internet și am găsit multe articole care discutau această problemă. În final, am găsit cel mai util articol pe forumul DEV2DEV al BEA
Aici moderatorul YuLimin a făcut testul și a ajuns la concluzia:
Versiunea JVM companiei Client cu memorie maximă (mega) Server cu memorie maximă (mega)
DUM 1.5.x 1492 1520
SUN 1.5.5 (Linux) 2634 2660
DUM 1.4.2 1564 1564
DUM 1.4.2 (Linux) 1900 1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Acum folosesc JDK1.6.0_05, am testat-o. Cel mai important lucru în starea clientului este că JDK-ul meu nu recunoaște parametrul -Server și nu poate testa starea serverului. Estimările sunt cam aceleași.
DUM 1.6.0 1442 N/d
Se pare că este imposibil să folosești o memorie mare în Java. Și zicala generală este că dacă memoria este prea mare, timpul de colectare a gunoiului va fi lung. Acest lucru este de înțeles, de obicei colectat când memoria nu este suficientă, scanarea memoriei 2G este, desigur, mult mai lentă decât 1G și există mai multe obiecte de memorie, relația estimată crește exponențial.
Mai jos sunt atașate metodele de testare și înregistrările de testare ale lui YuLimin.
Metoda de testare:Testează cu comanda java -XmxXXXXM -version din linia de comandă, și apoi creșterea treptată a valorii XXXX, dacă este executată normal, înseamnă că dimensiunea memoriei specificată este disponibilă, altfel va fi tipărit un mesaj de eroare.
Testează memoria maximă suportată a JVM-ului, apoi setează variabilele de mediu pe sistem
Numele variabilei: _JAVA_OPTIONS Valoare: - Xmx1G
|
Precedent:Se folosește pluginul jQuery fullscreen "jQuery Fullscreen Plugin"Următor:Diferența dintre certificatele SSL, OV, DV și EV
|