Clojure: funksjonell programmering og backendutvikling på JVM · leksjon

Minnehåndtering og redusert GC-belastning

Forstå søppelinnsamling i JVM, og lær konkrete Clojure-teknikker for å redusere allokeringer og GC-pauser i ytelseskritiske kodebaner.

Leksjon 4 av 413 trinn

Minnehåndtering og redusert GC-belastning er en gratis leksjon i Clojure: funksjonell programmering og backendutvikling på JVM på CoddyKit. Dette er leksjon 4 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 Clojure: funksjonell programmering og backendutvikling på JVM, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Clojure: funksjonell programmering og backendutvikling på JVM inneholder totalt 4 leksjoner.

Hvorfor GC er viktig

JVM-en frigjør automatisk ubrukt minne gjennom søppelinnsamling. GC-pauser kan imidlertid skade svartiden. Færre allokeringer betyr mindre arbeid for GC og jevnere ytelse.

Generasjonshaugen

JVM-haugen er delt inn i generasjoner. De fleste objekter dør unge, så den unge generasjonen samles inn ofte og billig; overlevende objekter flyttes til den gamle generasjonen.

Allokering i Clojure

Clojures uforanderlige datastrukturer deler struktur effektivt, men transformasjoner allokerer fortsatt minne. I stramme løkker blir disse allokeringene mange.

; each map call allocates a new seq node
(reduce + (map inc (range 1000000)))

Transients

Transients gjør det mulig å bygge samlinger midlertidig på en foranderlig, men trygg måte, slik at mellomliggende allokeringer unngås. Konverter tilbake med persistent!.

(defn build [n]
  (persistent!
    (reduce conj! (transient []) (range n))))

Unngå boxing

Primitive tall blir pakket inn i objekter når de lagres i generiske samlinger. Typehint og primitiv aritmetikk unngår denne ekstrakostnaden.

(defn sum-sq ^long [^long n]
  (loop [i 0 acc 0]
    (if (< i n)
      (recur (inc i) (+ acc (* i i)))
      acc)))

Gjenbruke buffere

Ved I/O og tallberegninger reduserer gjenbruk av tabeller, i stedet for å allokere ved hvert kall, belastningen på GC betydelig.

(let [buf (byte-array 8192)]
  (loop []
    (let [n (.read in buf)]
      (when (pos? n)
        (.write out buf 0 n)
        (recur)))))

Lazy-sekvenser og minne

Lazy-sekvenser allokerer sekvensnoder og kan holde hodet i minnet. For rene transformasjoner bør de foretrekke reduce eller transdusere, som unngår mellomliggende samlinger.

(transduce (comp (map inc) (filter even?)) + 0 (range 1000000))

Velge en collector

Moderne JVM-er tilbyr collectors som er optimalisert for ulike mål:

  • G1: balansert standardvalg
  • ZGC / Shenandoah: svært korte pauser
  • Parallel: maksimal gjennomstrømning, lengre pauser
; enable ZGC
; java -XX:+UseZGC -jar app.jar

Måle GC

Aktiver GC-logging for å se hvor ofte og hvor lenge pausene varer, før de begynner å finjustere. Gjett aldri – mål.

; java -Xlog:gc -jar app.jar

Dimensjonere haugen riktig

Sett minimums- og maksimumsstørrelsen for haugen likt for å unngå pauser ved størrelsesendringer, og dimensjoner basert på det reelle arbeidssettet. For liten størrelse fører til hyppig GC; for stor størrelse sløser med minne og forlenger innsamlingen av den gamle generasjonen.

; java -Xms2g -Xmx2g -jar app.jar

En arbeidsflyt for finjustering

Praktisk løkke: profiler for å finne allokeringer i kritiske kodebaner, bruk transients, primitiver og transdusere, mål GC-loggene, og finjuster deretter collector og heap bare hvis det er nødvendig.

Hurtigsjekk

Test kunnskapene deres om minnefinjustering.

Oppsummering

De har lært å redusere belastningen på GC i Clojure.

  • Bruk transients, primitiver og transdusere for å redusere allokeringer
  • Gjenbruk buffere i kritiske kodebaner
  • Mål med GC-logger, og finjuster deretter collector og heap-størrelse
Gratis å komme i gang

Lær deg Clojure 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
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Minnehåndtering og redusert GC-belastning» gratis?

Ja – hele teksten i «Minnehåndtering og redusert GC-belastning» 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 Clojure: funksjonell programmering og backendutvikling på JVM-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Clojure: funksjonell programmering og backendutvikling på JVM inneholder totalt 4 leksjoner.

Hva lærer jeg i «Minnehåndtering og redusert GC-belastning»?

Forstå søppelinnsamling i JVM, og lær konkrete Clojure-teknikker for å redusere allokeringer og GC-pauser i ytelseskritiske kodebaner. Du øver på Clojure: funksjonell programmering og backendutvikling på JVM 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 Clojure: funksjonell programmering og backendutvikling på JVM?

Ingen tidligere erfaring er nødvendig. Clojure: funksjonell programmering og backendutvikling på JVM 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 4 av 4.

Hvor lang tid tar leksjonen «Minnehåndtering og redusert GC-belastning»?

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 Clojure: funksjonell programmering og backendutvikling på JVM-leksjonen?

Ja. Alle Clojure: funksjonell programmering og backendutvikling på JVM-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

  1. Profilering av Clojure-applikasjoner
  2. Anbefalte metoder for JVM-ytelse
  3. Referansemåling og optimalisering av flaskehalser
  4. Minnehåndtering og redusert GC-belastning
← Tilbake til Clojure: funksjonell programmering og backendutvikling på JVM