Garbagecollector -> Riesen Speicherverbrauch?
-
Java und C# Anwendungen brauchen ja immer ne ganze menge Speicher. Liegt das am GC?
-
Vorrausdenker schrieb:
Liegt das am GC?
ich glaub's auch.
den gc-heap kannste übrigens konfigurieren (mit -Xms und -Xmx).
kannst ja mal mit rumspielen, vielleicht hilfts...

-
Was auf jeden Fall mit GC passiert ist, dass Programme die eigentlich kaum Speicher verwenden, dafür oft Objekte anfordern und wieder freigeben, einen Haufen Speicher verbrauchen.
-
Das haengt vom GC ab. Manche allokieren vorher nen riesen batzen speicher, weil sie meistens nicht nur zum verwalten unreferenzierter objekte verwendet werden, sondern oft auch die allokation managen, was das spaetere collecten einfacher macht.
manche haben eine stackartige speicherstruktur, wenn man also das zuletzt allokierte objekt nie freigibt, ist der ganze speicher davor auch immer brachliegend.
manche GC (z.b. bei einigen java-versionen) wird einfach doppelt speicher allokiert, es werden immer 50% benutzt und wenn mal keine allokation mehr moeglich ist, wird jedes objekt worauf es noch eine referenz gibt in den anderen speicher kopiert (hintereinander) und man hat wieder die moeglichkeit den freien platz (der jetzt in einem block vorliegt) zu vergeben.
aber all das ist leider sehr suboptimal, weil ein GC nie wissen kann was sich der programmierer so fuer ein objekt ausgedacht hat (betreffen lebenszeit, abhaengigkeiten usw.)viele fangen an ihren speicher selber zu managen, indem sie irgendwo eine list mit allen freien objekten haben (eventuell nach typ geordnet) und dann vor ein new erst pruefen ob sie aus einer liste soein objekt erhalten koennen.
Viele handyspiele managen komplett ihren speicher, weil da nicht viel raum fuer das rummuellen eines GC ist.aber grundsaetzlich ist viel new/delete schlecht. Es gibt einiges an guter software(auch einige spiele dabei), die nur beim state/context-switch speicher deleten/allokieren, ansonsten laufen sie ohne eine einzige allokation.
leider gibt es sehr viel mehr software die fast alles was array/vector ist mit new/delete meinen loesen zu muessen.
-
Vorrausdenker schrieb:
Java und C# Anwendungen brauchen ja immer ne ganze menge Speicher. Liegt das am GC?
Es gibt da mehrere Faktoren. Der GC führt sicherlich dazu, dass teilweise mehr Speicher belegt wird, als eigentlich benötigt wird. Aber es gibt da noch andere Dinge. Beispielsweise sind Objekte in Java einfach größer als in C++. ...weil man Informationen mit abspeichert, die man für Reflection usw. benötigt. Dazu kommt noch, dass neben dem eigentlichen Programm ja auch noch eine virtuelle Maschine läuft, die auch Speicher benötigt. ...und vermutlich gibt es auch noch weitere Faktoren.
Was nun der dominierende Effekt ist, hängt sehr vom jeweiligen Programm ab. ...bei einem Hello-World wird es zum Beispiel der Overhead durch die virtuelle Maschine sein.