Oppdage og løse minnelekkasjer
Identifiser vanlige mønstre for minnelekkasjer (statiske samlinger, lyttere og hurtigbuffere), og løs dem.
Oppdage og løse minnelekkasjer er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva er en minnelekkasje i Java?
En minnelekkasje i Java oppstår når objekter ikke lenger trengs, men fortsatt er sterkt nåbare, slik at GC hindres i å frigjøre dem. Heapen vokser til det oppstår en OutOfMemoryError.
Oppsamling i statiske samlinger
Et statisk felt som inneholder en samling som stadig vokser, er en klassisk lekkasje. Objekter som legges til, men aldri fjernes, forblir i live så lenge applikasjonen kjører.
public class Cache {
// LEAK: static list grows forever if items are never removed
private static final List<Object> items = new ArrayList<>();
public static void add(Object o) { items.add(o); }
// Fix: add a remove() method or use a bounded cache
}Hendelseslyttere som ikke avregistreres
Hvis en lytter registreres uten å bli fjernet, holdes både lytteren og objektene den refererer til, i live. Avregistrer alltid lyttere når de ikke lenger trengs.
// Leak:
sensor.addListener(new DataLogger());
// Fix:
DataLogger logger = new DataLogger();
sensor.addListener(logger);
// ... when done:
sensor.removeListener(logger);ThreadLocal-variabler som ikke ryddes opp
I trådp eller overlever ThreadLocal-verdier mellom oppgaver fordi trådene gjenbrukes. Hvis verdiene ikke fjernes, lekker data fra én oppgave inn i påfølgende oppgaver på samme tråd.
private static final ThreadLocal<MyContext> CTX = new ThreadLocal<>();
// Always clean up after each task:
try {
CTX.set(new MyContext(requestId));
doWork();
} finally {
CTX.remove(); // prevents leak in pooled threads
}Klasselasterlekkasjer i applikasjoner med hot deployment
I servlet-beholdere bruker hver utrulling en ny klasselaster. Hvis en klasse holder en statisk referanse til en klasse fra den gamle klasselasteren, kan ikke hele den gamle klasselasteren, eller noen av klassene den inneholder, samles inn av GC.
Oppdage lekkasjer med heap-dumper
Ta en heap-dump med jmap -dump:format=b,file=heap.hprof <pid>, og åpne den deretter i Eclipse MAT eller VisualVM for å finne de største objektene som holdes i minnet, og GC-røttene deres.
// Take a heap dump:
jmap -dump:live,format=b,file=heap.hprof $(jps | grep MyApp | cut -d" " -f1)
// Or trigger on OOM:
// -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.hprofEclipse Memory Analyzer (MAT)
Rapporten «Leak Suspects» i MAT identifiserer automatisk objekter med stor beholdt heap og viser banen fra GC-røttene. Start med visningen «Dominator Tree» for å finne de største synderne.
Bruke WeakReference for å unngå lekkasjer
Legg objekter som brukes i cacher eller lyttere, inn i WeakReference. GC kan frigjøre dem når det er lite minne tilgjengelig. Kontroller alltid om resultatet fra get() er null.
Map<String, WeakReference<Image>> imageCache = new HashMap<>();
imageCache.put("logo", new WeakReference<>(loadImage("logo.png")));
Image logo = imageCache.get("logo") != null ? imageCache.get("logo").get() : null;
if (logo == null) logo = reload("logo.png"); // re-load if GCedBegrensede cacher med LinkedHashMap LRU
Overstyr removeEldestEntry i en LinkedHashMap for å begrense størrelsen på cachen og automatisk fjerne den minst nylig brukte oppføringen.
Map<String, String> lruCache = new LinkedHashMap<>(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<String, String> e) {
return size() > 100; // evict when over 100 entries
}
};Profilere allokeringer med Java Flight Recorder
JFR (Java Flight Recorder) registrerer allokeringsprofiler med minimal overhead. Aktiver JFR med -XX:StartFlightRecording, og analyser dataene med JDK Mission Control.
// Start a 60-second JFR recording:
java -XX:StartFlightRecording=duration=60s,filename=rec.jfr MyApp
// Or via jcmd:
jcmd <pid> JFR.start duration=60s filename=rec.jfrSjekkliste for å fikse lekkasjer
Kontroller: statiske samlinger, lyttere som ikke er avregistrert, ThreadLocals i trådpooler, lekkasjer fra tilkoblinger eller strømmer (bruk try-with-resources), referanser fra indre klasser til ytre objekter og cacher uten automatisk fjerning.
Kort kontroll
Hvilket JVM-flagg lagrer automatisk en heap-dump når OutOfMemoryError oppstår?
Oppsummering
Vanlige kilder til Java-lekkasjer er statiske samlinger, lyttere som ikke er avregistrert, ThreadLocals i trådpooler og cacher uten størrelsesbegrensning. Oppdag lekkasjer med heap-dumper og MAT. Fiks dem med WeakReferences, begrensede datastrukturer og ved alltid å fjerne referanser når de ikke lenger trengs.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Oppdage og løse minnelekkasjer» gratis?
Ja – hele teksten i «Oppdage og løse minnelekkasjer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Oppdage og løse minnelekkasjer»?
Identifiser vanlige mønstre for minnelekkasjer (statiske samlinger, lyttere og hurtigbuffere), og løs dem. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Oppdage og løse minnelekkasjer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- JVM-heapområder og objektenes livssyklus
- GC-algoritmer: Serial, G1, ZGC og Shenandoah
- Oppdage og løse minnelekkasjer
- GC-justeringsflagg og JVisualVM-profilering