Sieht so aus, als könnte es abstimmbar sein, ist es aber nicht. Der gleichzeitige Mark-Sweep-Kollektor hängt an der Implementierung des Standardheaps von must_clear_all_soft_refs()
, die anscheinend nur true
ist, wenn eine _last_ditch_collection
ausgeführt wird.
bool GenCollectedHeap::must_clear_all_soft_refs() {
return _gc_cause == GCCause::_last_ditch_collection;
}
Während normale Handhabung ausgefallener Zuteilung hat drei aufeinander folgende Aufrufe an den do_collect
Methode Heap, in den CollectorPolicy.cpp
HeapWord* GenCollectorPolicy::satisfy_failed_allocation(size_t size,
bool is_tlab) {
Welche zu sammeln versucht, neu zu verteilen versucht, versucht, den Haufen zu erweitern, wenn das fehlschlägt und versucht dann als letzten Versuch, Clearing-Soft-Referenzen zu sammeln.
Der Kommentar in der letzten Kollektion ganz (und die einzige, die weich Refs Trigger Clearing) sagt
// If we reach this point, we're really out of memory. Try every trick
// we can to reclaim memory. Force collection of soft references. Force
// a complete compaction of the heap. Any additional methods for finding
// free memory should be here, especially if they are expensive. If this
// attempt fails, an OOM exception will be thrown.
{
IntFlagSetting flag_change(MarkSweepAlwaysCompactCount, 1); // Make sure the heap is fully compacted
gch->do_collection(true /* full */,
true /* clear_all_soft_refs */,
size /* size */,
is_tlab /* is_tlab */,
number_of_generations() - 1 /* max_level */);
}
--- Edited in Reaktion auf die Hand, ich beschrieb schwache Verweise, nicht weich diejenigen ---
In der Praxis würde ich mir vorstellen, dass SoftReferences nur "nicht" gefolgt werden, wenn die JVM für Garbage Collection aufgerufen wird als Antwort auf sie versuchen, eine zu vermeiden.
Für SoftReference
s kompatibel zu allen vier Java 1.4 Garbage Collectors und mit dem neuen G1 Collector muss die Entscheidung nur bei der Erreichbarkeitsbestimmung liegen. Wenn das Ernten und Verdichten stattfindet, ist es viel zu spät, um zu entscheiden, ob ein Objekt erreichbar ist.Dies legt nahe (aber ist nicht erforderlich), dass ein Sammlungs- "Kontext" existiert, der die Erreichbarkeit basierend auf der Verfügbarkeit von freiem Speicher in dem Heap bestimmt. Ein solcher Kontext müsste anzeigen, dass man nicht vor dem Versuch, ihnen zu folgen, SoftReference
s folgt.
Da OutOfMemoryError
Vermeidung Garbage Collection speziell in einer vollständigen Sammlung geplant ist, Stop-the-World Art und Weise, wäre es nicht ein schwer vorstellbar Szenario, wo der Heap-Manager ein "Do not follow SoftReference
" -Flag vor der Sammlung erfolgt.
--- Ok, also habe ich beschlossen, dass ein „muss so funktionieren“ beantworten gerade genug ---
aus dem Quellcode src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp (Highlights sind mir) nicht gut war
Der Betrieb tatsächlich "do" Garbage collection:
170 void VM_GenCollectFullConcurrent::doit() {
Wir sollten besser ein VM-Thread sein, andernfalls wird ein "Programm" thread Mülleinsammlungs ist!
171 assert(Thread::current()->is_VM_thread(), "Should be VM thread");
Wir sind eine gleichzeitige Sammler, so dass wir besser gleichzeitig geplant werden!
172 assert(GCLockerInvokesConcurrent || ExplicitGCInvokesConcurrent, "Unexpected");
173
Greifen Sie den Heap (der das GCCause-Objekt enthält).
174 GenCollectedHeap* gch = GenCollectedHeap::heap();
Überprüfen Sie, ob wir einen Vordergrund „jungen“ Sammlung
175 if (_gc_count_before == gch->total_collections()) {
176 // The "full" of do_full_collection call below "forces"
177 // a collection; the second arg, 0, below ensures that
178 // only the young gen is collected. XXX In the future,
179 // we'll probably need to have something in this interface
180 // to say do this only if we are sure we will not bail
181 // out to a full collection in this attempt, but that's
182 // for the future.
die Programm-Threads nicht mit dem Heap einzumischen sind, brauchen?
Holen Sie die Garbage Collection Ursache (der Grund für diese Sammlung) aus dem Heap.
185 GCCauseSetter gccs(gch, _gc_cause);
eine vollständige Sammlung des jungen Raumes Do
Hinweis, dass seine Pässe in dem Wert der Flagge must_clear_all_soft_refs Heap , die in einem OutOfMemory Szenario auf true gesetzt worden sein, und in jedem Fall leitet die „do_full_collection“ auf nicht folgen Sie den weichen Referenzen
186 gch->do_full_collection(gch->must_clear_all_soft_refs(),
187 0 /* collect only youngest gen */);
die _gc_cause eine Enumeration ist, das ist (Mutmaßungen hier) explizit gelöscht (unter dem „Recht auf _allocation_failure
im ersten Versuch OutOfMemoryError
und _last_ditch_collection
danach nicht zu vermeiden (um zu versuchen, vorübergehenden Müll zu sammeln)
Ein kurzer Blick in den memory "heap" module dass in do_full_collection
zeigt welche do_collection
weiche Referenzen nennt "Bedingungen) mit der Linie
480 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
--- Original-Beitrag für die folgt, die über schwache Verweise lernen wollen ---
In der Mark und Sweep Algorithmus, Soft-Referenzen nicht gefolgt von dem Haupt-Thread (und somit nicht markiert, es sei denn, ein anderer Zweig könnte es durch nicht weiche Referenzen erreichen.
Im Kopieralgorithmus werden weiche Referenzen von Objekten auf nicht kopiert (auch wenn sie nicht durch eine andere nicht weiche Referenz erreicht werden).
Wenn Sie dem Referenznetz aus dem Hauptthread der Ausführung folgen, werden weiche Referenzen nicht gefolgt. Dadurch können ihre Objekte als Garbage Collection erfasst werden, so als ob sie keine Referenzen hätten, die auf sie verweisen.
Es ist wichtig zu erwähnen, dass Soft-Referenzen fast nie isoliert verwendet werden. Sie werden normalerweise in Objekten verwendet, in denen das Design mehrere Verweise auf das Objekt haben soll, aber nur eine Referenz muss gelöscht werden, um die Garbage Collection auszulösen (zur einfachen Pflege des Containers oder zur Laufzeit, ohne dass teure Referenzen gesucht werden müssen). .
relevant? [Wie Hotspot beschließt, SoftReferences zu löschen] (http://jeremymanson.blogspot.com/2009/07/how-hotspot-decide-to-clear_07.html) –
@MiserableVariable Ja, ziemlich relevant, obwohl Ihr Link einen Brief fehlt : http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html –
Es fehlte es nicht früher, aber ich musste klug handeln und einen Link daraus machen .. Da Ich weigere mich, die Dokumentation zu lesen und versuche es durch Versuch und Irrtum, manchmal wird echter Inhalt gelöscht. Wen kümmert es, solange es schön aussieht, oder? –