8.1 Zwakke referenties in Java
Er zijn verschillende soorten verwijzingen in Java.
Er is StrongReference - dit zijn de meest voorkomende links die we elke dag maken.
Object object = new Object();//created an object
object = null;//can now be garbage collected
En er zijn drie "speciale" soorten links - SoftReference, WeakReference, PhantomReference. In feite is er slechts één verschil tussen alle soorten links: het gedrag van de GC met de objecten waarnaar ze verwijzen. We zullen de details van elk linktype later in meer detail bespreken, maar voor nu is de volgende kennis voldoende:
- SoftReference is een zachte referentie, als de GC ziet dat een object alleen toegankelijk is via een reeks zachte referenties, zal het het uit het geheugen verwijderen. Misschien.
- WeakReference - een zwakke referentie, als de GC ziet dat een object alleen toegankelijk is via een keten van zwakke referenties, zal het het uit het geheugen verwijderen.
- PhantomReference is een fantoomreferentie, als de GC ziet dat een object alleen beschikbaar is via een reeks fantoomreferenties, zal het het uit het geheugen verwijderen. Na verschillende runs van GC.
Je kunt ook zeggen dat linktypes een bepaalde mate van zachtheid hebben:
- Een gewone harde link is elke variabele van een referentietype. Niet opgeruimd door de vuilnisman voordat het ongebruikt wordt.
- SoftReferentie . Het object zorgt er niet voor dat al het geheugen wordt opgebruikt - het wordt gegarandeerd verwijderd voordat er een OutOfMemoryError optreedt. Misschien eerder, afhankelijk van de uitvoering van de vuilnisman.
- Zwakke referentie . Zwakker zacht. Verhindert niet dat het object wordt afgevoerd; de vuilnisman negeert dergelijke verwijzingen.
- PhantomReferentie . Gebruikt voor "dood" verwerking van een object: het object is beschikbaar na afronding totdat het wordt opgeruimd.
Als het nog niet duidelijk is wat het verschil is, maak je dan geen zorgen, straks valt alles op zijn plek. De details zitten in de details, en de details zullen volgen.
8.2 WeakReference en SoftReference in Java
Laten we eerst eens kijken naar het verschil tussen WeakReference en SoftReference in Java.
Kortom, de vuilnisman zal het geheugen van een object vrijmaken als er slechts zwakke referenties naar verwijzen. Als SoftReferences naar het object verwijst, wordt geheugen vrijgemaakt wanneer de JVM dringend geheugen nodig heeft.
Dit geeft in bepaalde gevallen een duidelijk voordeel aan SoftReference ten opzichte van Strong reference. SoftReference wordt bijvoorbeeld gebruikt om een applicatiecache te implementeren, dus het eerste wat de JVM doet, is objecten verwijderen waarnaar alleen SoftReferences verwijzen.
WeakReference is geweldig voor het opslaan van metadata, zoals het opslaan van een verwijzing naar een ClassLoader. Als er geen klasse is geladen, moet u niet verwijzen naar de ClassLoader. Dit is de reden waarom WeakReference het voor de vuilnisman mogelijk maakt om zijn werk op de ClassLoader te doen zodra de laatste sterke verwijzing ernaar is verwijderd.
Zwakreferentievoorbeeld in Java:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
SoftReference-voorbeeld in Java:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 PhantomReferentie in Java
De instantie PhantomReference wordt op dezelfde manier gemaakt als in de voorbeelden WeakReference en SoftReference, maar wordt zelden gebruikt.
Een PhantomReference kan worden opgeschoond als het object geen sterke (Strong), zwakke (WeakReference) of zachte (SoftReference) referenties heeft.
U kunt een fantoomreferentieobject als volgt maken:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference kan worden gebruikt in situaties waarin finalize() geen zin heeft. Dit referentietype verschilt van andere typen omdat het niet is ontworpen om toegang te krijgen tot een object. Het is een signaal dat het object al is voltooid en dat de vuilnisman klaar is om zijn geheugen terug te winnen.
Om dit te doen, plaatst de vuilnisophaler het in een speciale ReferenceQueue voor verdere verwerking. ReferenceQueue is waar objectreferenties worden geplaatst om geheugen vrij te maken.
Fantoomreferenties zijn een veilige manier om te weten dat een object uit het geheugen is verwijderd. Denk bijvoorbeeld aan een applicatie die te maken heeft met grote afbeeldingen. Laten we zeggen dat we een afbeelding in het geheugen willen laden als deze al in het geheugen zit, klaar voor opschonen. In dit geval willen we wachten tot de vuilnisman de oude afbeelding doodt voordat de nieuwe afbeelding in het geheugen wordt geladen.
Hier is PhantomReference een flexibele en veilige keuze. De verwijzing naar de oude afbeelding wordt doorgegeven aan de ReferenceQueue nadat het oude afbeeldingsobject is vernietigd. Zodra we deze link hebben, kunnen we de nieuwe afbeelding in het geheugen laden.