Permalänk
Medlem

Java Garbage Collector

Just Garbage Collector (skräpsamlare) kommer att bli ett kärt litet diskussionsämne så snart man har börjat komma upp i storlek med sina program och börjar jaga prestanda och minnesläckor. Ibland kan man få oväntade frysningar rent slumpmässigt där det är skräpsamlaren som helt enkelt skall ha städdag.

Nu finns det olika skräpsamlare beroende på användnigsfall, och det finns en artikel med YouTube-video om detta.

Om det är till nytta för någon vet jag inte, men om någon får glädje av kunskapen är det bra.

https://medium.com/expedia-group-tech/practical-jvm-gc-tuning...

Permalänk
Medlem

Jag tänker att är prestanda så viktigt för ditt program att du vill ha mer kontroll över GCn så kanske man bör fundera ifall man ska använda java över huvudtaget.

Permalänk
Medlem
Skrivet av willesakken:

Jag tänker att är prestanda så viktigt för ditt program att du vill ha mer kontroll över GCn så kanske man bör fundera ifall man ska använda java över huvudtaget.

Jag skulle nog säga att gc är ett löst problem när det gäller jvm. Använder man ZGC (-XX:+UseZGC) och jdk17 så håller sig de längsta paus tiderna under 500μs och de ligger oftast runt 50μs. Testade en enkel akka stream applikation på min nuc som bara genererar en massa meddelanden och aggregerar statistik varje sekund. 40 miljoner nya meddelanden per sekund, en massa skräp och max paus tid 51μs. 0.05ms - 0.5ms pauser kan jag leva med för de flesta applikationer.

Permalänk
Medlem
Skrivet av willesakken:

Jag tänker att är prestanda så viktigt för ditt program att du vill ha mer kontroll över GCn så kanske man bör fundera ifall man ska använda java över huvudtaget.

Jag skulle säga att det har att göra med din systemlösning. Du kanske kommer fram till att du skall köra olika GC på olika delar av systemlösningen för bästa prestanda och onödiga frysningar i användargränssnitt. Det kan låta löjligt, men när du har ett större system kan det göra stor skillnad.

Det skulle kunna vara aktuellt att använda andra programmeringsspråk än Java, men varje språk har sina fördelar och nackdelar och det kan vara önskvärt att inte ha för många olika språk i ett större system. Ofta är man beroende av olika tredjepartspaket också - det finns ganska många till Java, likartade till C# eller Python. Men det blir ofta en hel del trubbel att blanda.

Själv har jag inte laborerat så mycket med olika typer av GC, men ibland anropat System.GC() för att få en garbage collection innan jag kollar hur mycket minne som är allokerat för att avgöra om jag har små minnesläckor som växer över lång tid. Kör en GC, kolla minnesallokering och om den är lika över lång tid (litet variation kan det alltid vara) så är allt lungt, är trenden växande så är det ett problem. Inte en perfekt approach, men för att se trender räcker det och då är det bra att känna till vilken GC man har och vad man skall förvänta sig.

Det är helt enkelt "next level" på Java-programmering att fundera på vilken GC man skall köra. Prestanda är ett generellt ord som antingen kan ange kontinuerligt dataflöde eller transaktionslatens, och vill du ha hög throughput under en timme och sedan avsluta programmet så är det en typ av GC du vill ha där den kan ägna all tid i slutet av din körning till GC-arbete, har du användargränssnitt så vill du antagligen ha en annan där du istället kör GC i små paket ofta och döljer tiden det tar.

Permalänk
Medlem

Vill du analysera minnesanvändningen för en Java-process så finns också VisualVM att använda, som är gratis. Du kan dels se grafer för minnesanvändning över tid, och även undersöka vilka objekt som allokerats för att bättre kunna förstå var minnet tar vägen. Det går också att skapa heap-dumpar och skapar du flera så går det dessutom att jämföra dem med varandra. Dessutom finns en knapp för att manuellt köra den garbage collector som är konfigurerad, om du vill.

Vill man ha lite mera kraftfulla funktioner och integration med sin IDE så finns YourKit, men den kostar tyvärr ca 5 000 kronor per år (och går endast att köpa som företag). Tydligen kan man även köpa en personlig licens för runt 1 000 kronor en gång om året, men den finns bara tillgänglig en kort tid, så man får hålla utkik på deras Twitter-konto.

Permalänk
Medlem

Gick från c++ till java, för rätt länge sedan. Med vana av extrema minnesläckor från c++, så var det väldigt bekvämt att utveckla appar i java.

Kunde gå på några minuter innan man fyllt datorns minne med samma sak, om och om igen om man inte var noga att rensa efter sig(i cpp).

Nu var det länge sedan jag började med Java, men vill fortfarande känna att jag har kontrollen ibland. Därför återanvänder jag ibland objekt i mina spel eller appar om det går. Fast då att jag återställer dem med samma värden som när dom skapades(om möjligt).

Jag har dock lyckats få "typ memory leaks" trots GC. I dessa fall har minnesanvändningen ökat enormt på några sekunder, sedan kickar GC igång & rensar. I samband med det så hänger sig appen i någon/några sekunder för att sedan fortgå normalt. Därefter repeat!

Summa summarum!

Bra skit!

Om någon är intresserad så finner ni mina appar här: https://maseapps.com
Cert ej uppdaterat, därav varning.