2016-10-31 2 views
2
@Service 
public class test(){ 
    public Map<String, String> map= new HashMap<>(); 
} 

in einer Web-Anwendung Frühjahr mit kommentierten i eine Klasse mit @Service und definiert eine globale Variable Karte und Werte darin stecken.Java Garbage Collection für ideales Objekt

i angenommen

Kartenhaltewerte eingefügt, bis jemand den Server neu starten oder Entfernen von map.remove() verwendet;

aber mein Senior sagte mir wird es nur für einige Zeit halten nach einiger idealer Zeit und Müllsammler wird es entfernen, wie nach 2 oder 3 Tagen ist das wahr?

+2

Sehr zweifelhaft – Antoniossss

+4

"ist das wahr" klingt sehr zweifelhaft; Sie sollten ihn nach einer Erklärung fragen (Sie werden auf die eine oder andere Weise etwas lernen: dass es ein tatsächliches Problem ist und warum, oder dass Sie nicht auf diese Person hören sollten). Aber auf jeden Fall scheint auch das, was Sie zu tun versuchen, fragwürdig. –

+0

hi einfach vergessen, was ich versuche oder Anforderung! Wenn eine Klasse, die mit @service und einer darin enthaltenen globalen Variable versehen ist, die Daten speichert, bis der Server stoppt, oder wird nach einigen Tagen ein Müll gesammelt? –

Antwort

0

Karte enthält eine Liste der Adressen im Speicher. Diese Adressen halten die Werte, die Sie speichern mit

map.put(object); 

jedes Mal, wenn Sie möchten, einen bestimmten Wert abzurufen, die Sie im Speicher abgelegt haben Sie in der Adresse der Stelle vorbei, wo Sie Ihren Wert an und als Ergebnis gespeichert Sie erhalten Ihren gespeicherten Wert.

Zurück zu Ihrer Frage, wenn Sie den Wert aus der Karte entfernen, was wirklich passiert ist, verlieren Sie die Adresse des Ortes, wo Sie Ihren Wert gespeichert haben. Und es gibt keine andere Möglichkeit, auf diesen Wert zuzugreifen. Der Wert ist zwar immer noch im Speicher, aber Sie können ihn nicht verwenden, da Sie die Adresse seines Speicherorts gelöscht haben. Garbage Collector spült diesen Wert, aber Sie können den Garbage Collector nicht ausführen. Das Beste, was Sie tun können, ist System.gc() aufzurufen, was einfach ein Hinweis auf den Garbage Collector ist, den Sie eine Sammlung machen möchten. Und es wird jede beliebige zufällige Zeit ausgeführt oder wenn JVM mehr Speicher benötigt.

Als Ihr Senior erwähnt, dass es in 2-3 Tagen Müll gesammelt wird, nehme ich an, er spricht nur hypothetisch, weil Sie nie wissen, wann der Garbage Collector ausgeführt wird und den Speicher löschen.

+0

Nun meine Frage ist, wenn ich einige 10 Werte in map.he sagt diese 10 Werte werden Müll nach 2-3 Tagen gesammelt werden und meine Ansicht ist, werden sie nicht, bis wir es entfernen mit remove() oder den Server herunterfahren oder Objekt –

+0

Ah, ja! Wenn Sie die Werte in einer Datenstruktur oder in einem Objekt gespeichert haben, sind die Werte nicht für die Garbage Collection verfügbar, es sei denn, Sie rufen delete oder remove darauf auf oder Sie kompilieren den Code erneut. Selbst wenn eine Anwendung monatelang ausgeführt wird und Sie keine Datenbank zum Speichern von Werten verwenden, sondern Ihre eigenen Datenstrukturen und Objekte. Wenn Sie die Anwendung nicht schließen oder neu starten, bleiben Ihre Daten in Objekten gespeichert und stehen nicht für die Garbage Collection zur Verfügung. –

1

(1) abbildet halten eingefügt Werte bis jemand den Server neu starten oder Entfernen von map.remove() mit?

Ja, Sie haben Recht, die Daten zur Verfügung stehen werden, bis der Server neu gestartet wird oder map.remove() oder map.clear() aufgerufen.

(2) Es wird halten nur für einige Zeit nach einiger Zeit ideal und Müll Sammler wird es wie Tage nach 2 oder 3 entfernen ist das wahr?

Nein, das ist falsch, wird Garbage Collector löscht das Objekt nicht, wenn Sie die remove() oder clear() auf den Map nennen. Die Daten können in der Karte gedrückt/gehalten werden, bis sie erlaubt sind (d. H. Die MaxHeap-Größe) und darüber hinaus OutOfMemory-Ausnahmen auf dem Server erhalten.

PS: Aber ein Punkt, den Sie wissen müssen, ist, es ist nicht eine gute Idee, die Daten wie diese in eine Karte im Inneren Dienst zu speichern, sondern müssen Sie Caching-Frameworks (Ehcache, Hazelcast betrachten, usw. .) zum Zwischenspeichern/Speichern der Daten, die erweiterte Funktionen wie Cache-Ablauf, Verteilung von Daten über die Server usw. bereitstellen.

+0

Nur eine kleine Korrektur: 'Map' ist nur eine Schnittstelle, daher ist es durchaus möglich, dass eine Implementierung einige Einträge unter bestimmten Bedingungen erlaubt. ('java.util.WeakHashMap' ist ein solches Beispiel.) Es ist die spezifische' Map'-Implementierung 'HashMap', die einen starken Verweis sowohl auf Schlüssel als auch auf Werte behält und deren Garbage Collection verhindert, bis sie entfernt werden oder die Map selbst nicht mehr erreichbar ist . – biziclop