Inom programmering är en svag referens en specifik typ av referens till dynamiskt skapade objekt i system med sophämtning eller referensräkning . Det skiljer sig från starka referenser genom att sophämtaren inte tar hänsyn till förhållandet mellan referensen och föremålet på högen när den identifierar föremål som ska raderas. En svag referens låter dig alltså arbeta med ett objekt som en stark referens, men vid behov kommer objektet att raderas, även om det finns en svag referens till det. Vanliga referenser kallas ibland för "starka" referenser i samband med sophämtning.
Konceptet med en svag referens finns i system och programmeringsspråk där sophämtning stöds - automatisk borttagning från minnet av objekt vars användning har upphört och inte längre kommer att återupptas. För att fastställa vilka objekt som är föremål för sophämtning används en eller annan version av nåbarhetsalgoritmen - ett objekt anses nåbart om det finns minst en referens i programmet. När det inte finns en enda referens till ett objekt kvar i programmet, det vill säga användningen av objektet har upphört, kan ett sådant objekt tas bort vid nästa lämpliga ögonblick.
Den beskrivna mekanismen för att frigöra minne kan i vissa fall generera minnesläckor på grund av "glömda" referenser, när referenser till skapade objekt lagras på flera ställen och när objektet inte längre används raderar programmeraren inte alla. För att undvika problem tvingas programmeraren att följa en ganska stel disciplin i användningen av länkar, vilket inte alltid är bekvämt.
För att undvika problem som detta kan ett programmeringsspråk eller miljö stödja så kallade svaga referenser . Sådana referenser används på samma sätt som vanliga referenser, men påverkar inte sophämtningen, eftersom de inte beaktas av referensräknemekanismen, och objektet som sådana referenser finns till kan raderas, om det inte finns vanliga referenser till det (som i detta sammanhang kan kallas "starka länkar").
I de numera vanliga skräpsamlade programmeringsspråken, Java och C# , stöds svaga referenser på systembiblioteksnivå. I Java tjänar klasserna java.lang.ref.WeakReference och för detta java.lang.ref.SoftReference, i C#, System.WeakReference.
Proceduren för att använda svaga referenser är i grunden densamma i alla system.
Användningssättet för svaga referenser bestäms av uppgiften. En vanlig praxis är att i samlingar lagra svaga referenser till objekt som bara behövs så länge som applikationen använder dessa objekt. När ett objekt inte längre behövs och de starka referenserna till det tas bort, hindrar inte de svaga referenserna som lagras i samlingen att objektet tas bort från minnet, vilket eliminerar behovet av att explicit ta bort dem från samlingen.
En egenskap hos klassen SoftReference i Java är att när ett objekt tas bort tar sopsamlaren hänsyn till frekvensen för åtkomst till det genom denna referens, vilket kan vara användbart för att implementera cachning av data som finns till exempel på externa enheter - cachen samlingen håller automatiskt de objekt som nås oftare längre.
För att förhindra att svaga referenser till objekt som inte längre finns förorenar minnet, tillhandahåller systembibliotek mekanismer för att ta hänsyn till sådana referenser. En variant av denna mekanism är länkköer - speciella objekt som skickas till hänvisaren vid skapandet. När sopsamlaren förstör objektet som refereras av en svag referens, placerar den en referens till motsvarande referens i den tidigare godkända referenskön. Således är listan över referenser som innehåller "döda" länkar tillgänglig för programmet, och det kan radera dem när som helst.