I programmering er en svag reference en specifik type reference til dynamisk oprettede objekter i systemer med affaldsopsamling eller referencetælling . Den adskiller sig fra stærke referencer ved, at skraldemanden ikke tager hensyn til forholdet mellem referencen og genstanden på dyngen , når den identificerer genstande, der skal slettes. En svag reference giver dig således mulighed for at arbejde med et objekt som en stærk reference, men om nødvendigt vil objektet blive slettet, selvom der er en svag reference til det. Almindelige referencer omtales nogle gange som "stærke" referencer i forbindelse med affaldsindsamling.
Konceptet med en svag reference findes i systemer og programmeringssprog, hvor affaldsindsamling er understøttet - automatisk fjernelse fra hukommelsen af objekter, hvis brug er ophørt og ikke længere vil blive genoptaget. For at bestemme de objekter, der er genstand for affaldsindsamling, bruges en eller anden version af nåbarhedsalgoritmen - et objekt anses for tilgængeligt, hvis der er mindst én reference i programmet. Når der ikke er en eneste reference til et objekt tilbage i programmet, det vil sige, at brugen af objektet er ophørt, kan et sådant objekt slettes på det næste passende tidspunkt.
Den beskrevne mekanisme til frigørelse af hukommelse kan i nogle tilfælde generere hukommelseslækager på grund af "glemte" referencer, når referencer til oprettede objekter er lagret flere steder, og når objektet ikke længere bruges, sletter programmøren ikke dem alle. For at undgå problemer er programmøren tvunget til at overholde en ret stiv disciplin i brugen af links, hvilket ikke altid er praktisk.
For at undgå problemer som dette kan et programmeringssprog eller miljø understøtte såkaldte svage referencer . Sådanne referencer bruges på samme måde som almindelige referencer, men påvirker ikke affaldsindsamlingen, da de ikke tages i betragtning af referencetællemekanismen, og det objekt, som sådanne referencer eksisterer til, kan slettes, medmindre der er almindelige referencer til det (som i denne sammenhæng kan omtales som "stærke links").
I de nu almindelige affaldssamlede programmeringssprog, Java og C# , understøttes svage referencer på niveau med systembiblioteker. I Java tjener klasserne java.lang.ref.WeakReference og til dette java.lang.ref.SoftReference, i C# tjener System.WeakReference.
Proceduren for at bruge svage referencer er grundlæggende den samme i alle systemer.
Brugsmåden for svage referencer bestemmes af opgaven. En almindelig praksis er at gemme svage referencer til objekter i samlinger , som kun er nødvendige, så længe applikationen bruger disse objekter. Når et objekt ikke længere er nødvendigt, og de stærke referencer til det fjernes, forhindrer de svage referencer, der er gemt i samlingen, ikke objektet i at blive fjernet fra hukommelsen, hvilket eliminerer behovet for eksplicit at fjerne dem fra samlingen.
Et træk ved SoftReference-klassen i Java er, at skraldeopsamleren, når du sletter et objekt, tager højde for hyppigheden af at få adgang til det gennem denne reference, hvilket kan være nyttigt til implementering af caching af data , der for eksempel er placeret på eksterne enheder - cachen samling holder automatisk de objekter, der er tilgået oftere, længere.
For at forhindre svage referencer til objekter, der ikke længere eksisterer, fra at forurene hukommelsen, tilbyder systembiblioteker mekanismer til at tage højde for sådanne referencer. En variant af denne mekanisme er linkkøer - specielle objekter, der sendes til refereren ved oprettelse. Når garbage collector ødelægger det objekt, der refereres til af en svag reference, placerer den en reference til den tilsvarende referrer i den tidligere beståede referencekø. Således er listen over henvisninger, der indeholder "døde" links, tilgængelig for programmet, og det kan slette dem på ethvert passende tidspunkt.