ich habe das Problem dass der Speicherverbrauch meiner Applikationen in bestimmten Situationen rapide ansteigt (von wenigen MB zu ~70MB). der Speicher steigt nicht ins Unendliche an (sondern eben nur bis auf ~70MB), aber diese 70MB werden nie wieder freigegeben.
ich habe ein den Profiler JProbe verwendet um das Problem aufzuspüren. dort sehe ich, dass wie gesagt etwa 60/70 MB gebraucht werden (70 alloziert, 60MB wirklich genutzt). Diese werte ändern sich auch nach Minuten noch nicht. Klicke ich nun in JProbe auf "request Garbage Collection" sinkt der Speicherverbrauch auf 3/10 MB ab. Meine erste Frage nun: tut JProbe da irgendetwas besonders? wieso funktioniert es, wenn JProbe den "Befehl" zum Aufräumen gibt?
zweite frage: ich habe einige Forum-Threads zu dem Thema überflogen und bin auf System.gc() gestoßen. ALso hab ich meiner Applikation einen Button spendiert, der System.gc() aufruft. Und siehe da, auch das reduziert den Speicherverbrauch enorm! --> zweite frage ist ähnlich wie die erste: was macht System.gc(), was die normale Garbage Collection nicht macht? (Laut Dokumentation sagt es dem System doch nur, dass jetzt ein guter Zeitpunkt zum Aufräumen wäre.)
Dritte Frage: wenn System.gc() bzw. JProbe den Speicher aufräumen können, das ganze aber nicht automatisch passiert, deutet das dann eher auf einen Bug hin oder liegt der Fehler vermutlich trotzdem bei mir? Wenn er bei mir liegen sollte: kann mir jemand einen Beispiel-Code nennen, der den Speicherverbrauch so erhöht, dass er von der automatischen GC nicht mehr reduziert werden kann, sehr wohl aber von System.gc()? (mich verwirrt dies alles ein wenig, da ich mich um die GC in Java noch nie gekümmert habe...)
ich habe ein den Profiler JProbe verwendet um das Problem aufzuspüren. dort sehe ich, dass wie gesagt etwa 60/70 MB gebraucht werden (70 alloziert, 60MB wirklich genutzt). Diese werte ändern sich auch nach Minuten noch nicht. Klicke ich nun in JProbe auf "request Garbage Collection" sinkt der Speicherverbrauch auf 3/10 MB ab. Meine erste Frage nun: tut JProbe da irgendetwas besonders? wieso funktioniert es, wenn JProbe den "Befehl" zum Aufräumen gibt?
zweite frage: ich habe einige Forum-Threads zu dem Thema überflogen und bin auf System.gc() gestoßen. ALso hab ich meiner Applikation einen Button spendiert, der System.gc() aufruft. Und siehe da, auch das reduziert den Speicherverbrauch enorm! --> zweite frage ist ähnlich wie die erste: was macht System.gc(), was die normale Garbage Collection nicht macht? (Laut Dokumentation sagt es dem System doch nur, dass jetzt ein guter Zeitpunkt zum Aufräumen wäre.)
Dritte Frage: wenn System.gc() bzw. JProbe den Speicher aufräumen können, das ganze aber nicht automatisch passiert, deutet das dann eher auf einen Bug hin oder liegt der Fehler vermutlich trotzdem bei mir? Wenn er bei mir liegen sollte: kann mir jemand einen Beispiel-Code nennen, der den Speicherverbrauch so erhöht, dass er von der automatischen GC nicht mehr reduziert werden kann, sehr wohl aber von System.gc()? (mich verwirrt dies alles ein wenig, da ich mich um die GC in Java noch nie gekümmert habe...)