Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich möcht mal fragen, wie kann ich einen unnützlichen großen Objekt löschen für mehre freie Speicher?
Ich habe gelesen, dass java automatisch macht. Aber das funktioniert gut genug für mich. Deshalb habe ich eine Funktion "System.gc( )" entdeckt, sie macht vielleicht diese Arbeit für mich. Aber irgendwie funktioniert bei mir immer noch nicht. Unten ist meine Code:
Java:
public static void main(String[] args) {
int[][] abc = new int[10000][10000];
System.gc(); // Ich möchte die "abc" löschen, um Platz zu gewinnen , aber das funktioniert nicht.
int[][] bbc = new int[10000][10000];
}
Ich bekomme trotzdem immer die Fehlermeldung: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Wie kann ich das riesen Array "abc" sofort löschen nach dem Gebrauch?
Geht nicht. Kann man jetzt lange rumlabern aber kurz gesagt: du kannst den GC bitten, mit seiner Arbeit anzufangen. Wann er das letztendlich tut und den Speicher damit wieder freigibt, entscheidet er und ist durch dich nicht beeinflussbar. Du kannst null zuweißen. Damit gibt es schonmal keine Referenz mehr und das Objekt würde, für den Fall, dass der GC iwann zum Arbeiten anfängt, gelöscht werden.
edit: außerdem ist dein Code - mal abesehn davon, dass es eh nicht funktioniert - sowieso unlogisch. Auf das Array existiert noch eine Referenz. Somit würde es der GC eh nicht wegräumen.
edit: außerdem ist dein Code - mal abesehn davon, dass es eh nicht funktioniert - sowieso unlogisch. Auf das Array existiert noch eine Referenz. Somit würde es der GC eh nicht wegräumen.
public static void main(String[] args) {
int[][] abc = new int[10000][10000];
abc = null; //-- jetzt kann der GarbageCollector bei Bedarf den Speicher wieder freigeben
int[][] bbc = new int[10000][10000];
}
public static void main(String[] args) {
int[][] abc = new int[10000][10000];
abc = null; //-- jetzt kann der GarbageCollector bei Bedarf den Speicher wieder freigeben
int[][] bbc = new int[10000][10000];
}
Ob es gelesen worden ist oder nicht, spielt keine Rolle; es gibt aber noch eine Variable (hier abc), die auf das Array verweist, daher könnte es noch gelesen werden.
kann man auch wieder das gute alte Hundebeispiel nehmen:
Stell dir vor du hast einen Hund (dein Object - hier int[10000][10000]) an der Leine (deine Referenz - hier abc).
Solange du den Hund an der Leine hast, kann dieser schonmal nicht vom Hundefänger (GC) in den Hundezwinger gesteckt (Speicher freigeben) werden.
Sobald du die Leine löst, kann der Hund frei rumrennen.
Wann aber letztendlich der Hundefänger (nennt man das eigentlich so? ) den Hund fängt, steht nicht in deinem ermessen.
Hübscher Vergleich bis auf eine Kleinigkeit: Deinen Hund wirst Du im Normalfall wieder an die Leine nehmen können, hast Du erstmal die Referenz auf Dein Objekt gelöscht, wirst Du es nicht mehr "einfangen" können
Ich denke, das Bild passt schon (besonders mit einem schwarzen Hund in einer mondlosen Nacht) , wenn man davon ausgeht, das das Kappen der Leine den Hund sozusagen in einem undefinierten Zustand hinterlässt - möglicherweise ist er noch da, vielleicht auch nicht. Dieser von der Leine gelassenen schwarze Hund weist also gewissen Parallelen mit Schroedingers Katze auf (auch das will mein Hund wahrscheinlich nicht hören)
Vielleicht sollte man den Hund mit einem mit Helium gefüllten Ballon ersetzen, wobei ich noch nie von "mit-Helium-gefüllten-Ballon-Fängern" gehört habe
Neeee, passt ja schon der Vergleich, wollte nur die Frage vorbeugen "...und wie komm ich wieder an das Objekt nachdem ich es freigelassen habe?"
Dieser von der Leine gelassenen schwarze Hund weist also gewissen Parallelen mit Schroedingers Katze auf (auch das will mein Hund wahrscheinlich nicht hören)