Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie

Door Arjen van der Meijden

Lead Developer

Praktisch geheugenbeheer in Java bij Tweakers.net

Geheugen besparen: de basis

Om het geheugengebruik in Java te beperken zijn er twee mogelijkheden: de objecten moeten kleiner worden of het aantal objecten moet worden verlaagd. Alle trucs om geheugen te besparen zijn uiteindelijk terug te voeren op deze twee uitgangspunten. Soms kan het handiger zijn om het aantal objecten te vergroten, zolang dat maar betekent dat de objecten per stuk kleiner worden. Omgekeerd kan het ook nuttig zijn om grotere objecten te gebruiken, als het aantal objecten dan maar flink omlaag kan.

Verklein het aantal objecten

Elk object heeft minimaal 8 bytes nodig en meestal meer. Bovendien wordt minstens één referentie bijgehouden naar elk object dat in het geheugen actief blijft en ook dat kost geheugen. Door het aantal objecten te verkleinen wordt dus doorgaans geheugen bespaard.

Als een verzameling van 100.000 strings van gemiddeld 10 karakters, die dus 56 bytes per stuk kosten, kan worden teruggebracht tot 50.000 stuks, levert dat een besparing op van ruim 2,5MB. Soms kun je ook besparen door een groepje vaste objecten bij te houden, zodat je niet steeds nieuwe hoeft aan te maken, maar bestaande objecten kunt gebruiken.

Verklein de objecten zelf

Om geheugen te besparen ligt het voor de hand je objecten kleiner te maken. Door de afronding naar veelvouden van 8 bytes is dat echter niet altijd zinvol. Als een object 2 int-velden bevat en je kunt er 1 wegbezuinigen, dan levert dat je geen bit winst op. In beide gevallen is het object 16 bytes groot.

Als je echter zeker weet dat die 100.000 strings uit het eerdere voorbeeld uitsluitend tekens uit de ISO-8859-1-karakterset bevatten, dan weet je ook dat elk karakter maar 1 byte nodig heeft. De benodigde objecten vereisen dan nog maar een object van 2*4+4 (+4 bytes padding) = 16 bytes en een byte-array van 2*4+4+10 (+2 bytes padding) = 24 bytes, dus 40 bytes per stuk. Als je alleen de byte-arrays opslaat, zijn er zelfs maar 24 in plaats van de oorspronkelijke 56 bytes nodig. Dat levert in dit voorbeeld dus 1,5 of zelfs 3MB winst op.

Dat zijn nog geen enorme aantallen, maar het spreekt voor zich dat de winst bij grotere objecten en grotere aantallen objecten behoorlijk kan toenemen. Als de strings gemiddeld 200 karakters lang zijn, zouden we met onze byte-array-trucjes dus 20 tot 21MB kunnen besparen.

Tools om geheugen te analyseren

Er zijn diverse tools om het geheugengebruik van een draaiende applicatie te bekijken. Dit doen ze doorgaans door een heap dump te maken en die vervolgens te analyseren. Naast commerciële profilers als Yourkit, JProbe en JProfiler zijn er ook gratis tools; Oracle levert bij zijn JDK de tooltjes jmap en jhat, en Eclipse Memory Analyzer is in Eclipse te integreren. Het laatste programma kan vrij uitgebreide analyses van de heap dump maken, maar heeft momenteel nog geen ondersteuning voor CompressedOops, zodat de cijfers bij de objecten niet helemaal kloppen. Dat maakt echter niet veel uit bij het vinden van dubbele objecten, het volgen van referenties, het tellen van aantallen objecten, enzovoort.

Wat vind je van dit artikel?

Geef je mening in het Geachte Redactie-forum.

Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True