Kann nicht gesamten HeapSpace verwenden

  • Themenstarter Themenstarter ErdyMurphy
  • Beginndatum Beginndatum
E

ErdyMurphy

Gast
Hi,

ich versuche den kompletten heapspace zu verwenden was aber nicht funktionier.
Habe folgenden Code:
Java:
System.out.println("freememory:"+Runtime.getRuntime().freeMemory()/1024/1024);
System.out.println("maxmemory:"+Runtime.getRuntime().maxMemory()/1024/1024);
System.out.println("totalmemory:"+Runtime.getRuntime().totalMemory()/1024/1024);
long availableMem = Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory() + Runtime.getRuntime().freeMemory()-(307*1024*1024);
double size = Math.sqrt(availableMem/4);
System.out.println("size:"+size);
BufferedImage img = new BufferedImage((int)size,(int)size, BufferedImage.TYPE_INT_RGB);
System.out.println("freememory:"+Runtime.getRuntime().freeMemory()/1024/1024);
System.out.println("maxmemory:"+Runtime.getRuntime().maxMemory()/1024/1024);
System.out.println("totalmemory:"+Runtime.getRuntime().totalMemory()/1024/1024);

Ich berechne mir also den zur verfügungstehenden Speicher und versuche dann
ein Buffered Image zu erzeugen was diesen platz beansprucht...
das funktioniert auch soweit... nur darf ich nicht den kompletten Speicher
den ich von maxmemory angezeigt bekomme verwenden... deswegen ziehe ich mit - (307*1024*1024);
307 MB testweise ab (ich mache alos so als wäre weniger speicher zur verfügung für das bild) und es klappt.
Sobald ich 306 mb abziehe geht es nicht mehr.

Folgende ausgabe erzeigt das Programm:

freememory:15
maxmemory:989
totalmemory:15
size:13375.134242316972
freememory:4
maxmemory:989
totalmemory:687

dies bedeutet dass ich nur 687 MB von den 989MB nutzen kann ansonsten kommt
eine OutOfMemory Exception

Vielleicht einer ne Idee?
 
Tja. So Objekte usw. benötigen leider auch Metainformationen, die auch im Heap gespeichert werden. Das ist somit der "Verschnitt" gegenüber den reinen "Nutzdaten".
 
Du willst mir also sagen ich hab hier 300 MB Metadaten?
für was brauch ich dann so ne funktion mit welcher ich den speicher auslesen kann?
Glaub irgendwie nicht dass das des Rätsels Lösung ist
 
Du willst mir also sagen ich hab hier 300 MB Metadaten?
für was brauch ich dann so ne funktion mit welcher ich den speicher auslesen kann?
Glaub irgendwie nicht dass das des Rätsels Lösung ist

Ich habe natürlich angenommen, dass du bereits gegoogelt hast und weißt, wie in Java der Heap an sich organisiert ist. Du kennst Eden Space, Survivor Space und Tenured Generation, die ebenfalls den Heap bevölkern und weißt wie der GC arbeitet. Die Bereiche musst du natürlich auch noch abziehen von deinem GAO (größtem anzunehmenden Objekt).

[EDIT]
Noch die Suche, die dir vermutlich nur entfallen ist: java heap - Google-Suche
 
Zuletzt bearbeitet:
ich hab mir den Speicher schon mit der jconsole angeschaut...
da sieht man auch die verschiedenen heapteile...
aber wenn ich jetzt ein pogramm schreiben will, welches
aufgrund des speichers verschieden agieren soll...
wie soll das dann funtionieren wenn ich nur die halbe wahrheit
mitgeteilt bekomme... deswegen bin ich nicht so glücklich mit
dieser Aussage
 
Wie die Doku schon aussagt, ist das eine Näherung.

Wie willst du denn auf den freien Speicher in deinem Programm reagieren?

Nachdem das Speichermanagement nicht dem Entwickler, sonder der VM und dessen GC (sowie dessen Algorithmus) unterliegt, kannst du nicht mehr als eine Näherung erwarten.
 

Neue Themen


Zurück
Oben