Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Ohjelman "roskien" tutkiminen

Sivun loppuun

Burton [03.02.2007 14:47:23]

#

Hei. Olen miettinyt, että onko mahdollista tutkia ohjelmien jättämiä roskia muistissa? Esimerkiksi, jos omasta ohjelmastani on unohtunut joku grafiikkapinnan vapautus, niin näkyisikö se muistissa jotenkin?
Olen nimittäin ihmetelly omien ohjelmieni raskautta ja ajattelin, että siellä täällä voisi olla muistivuotoja. Onko muistivuotoja mahdollista löytää jotenkin ilman koodin tutkimista?

kayttaja-2791 [03.02.2007 15:13:23]

#

Eikös ne muistivuodot löydy ihan ajamalla sitä ohjelmaa, ja katsomalla että alkaako se rohmuta yhä enemmän muistia...?

Voit toki katsella niitä "roskia", kunhan tiedät muistipaikan josta niitä katsoa... Tietenkin jos muistia ei enään varata, niin jokin toinen ohjelmahan on voinut lätkäistä omia jätöksiään sinne roskiesi päälle.

En ole kyllä guru näissä asioissa, joku viisaampi korjatkoon jos olen hakoteillä.

tesmu [03.02.2007 15:31:15]

#

eiköhän se ihan näin mene että kun käynnistät ohjelman niin se aina varaa tietyn määrän muistia ja käyttää sitä omiin juttuihinsa ja kun ohjelma sammuu niin sillon niitten muistipaikkojen varaus loppuu ja ne on taas vapaita varattavaksi toiselle ohjelmalle ja muistinkäyttöhän tulee nimenomaan varatusta muistista

Blaze [03.02.2007 16:44:11]

#

Valgrind lupaa löytävänsä muistivuodot.

Burton [03.02.2007 20:22:02]

#

Käytössäni on Windows XP.
Miten tuo muistinvaraaminen näkyy? Tuleeko tehtävänhallintaa prosessien kohdalle kasvavasti kulutusta?

tesmu [03.02.2007 20:59:34]

#

Burton kirjoitti:

Käytössäni on Windows XP.
Miten tuo muistinvaraaminen näkyy? Tuleeko tehtävänhallintaa prosessien kohdalle kasvavasti kulutusta?

Siis prosessi taskissa näet kuinkapaljon ohjelma käyttää muistia tämä juuri on määrä mitä ohjelma on varannut muistia omille jutuilleen. Esimerkkinä vaikka olet junassa ja olet varannut itsellesi paikan niin kukaan muu ei tule paikallesi istumaan ellet lähde siitä pois jollon vapautat sen paikan. Ja varatut paikat voidaan nähdä esimerkiksi aseman tietokoneelta jotta niille ei myytäisi lippuja eli näät paljonko paikkoja on käytössä...

Burton [04.02.2007 00:38:45]

#

Mutta jos ohjelmassani on esim. näin:
FILE *a=fopen("teksti.txt","r");

enkä sulje sitä käyttäen fclose-funktiota, niin näenkö sitä mitenkään mistään?
Tai jos luon SDL-rajapinnan:
SDL_Surface *kuva=SDL_LoadBMP("kuva.bmp");

enkä tyhjennä sitä SDL_FreeSurface-funktiolla?

Pekka Karjalainen [06.02.2007 12:19:10]

#

Prosessin tietoja voi tutkia myös käyttiksen puolelta, ja ehkä selvittää jotain sen varaamista resursseista. Siitä voi joku kertoa, jos kerrot mitä käyttistä käytät. Yksi mahdollinen tapa on myös tutustua kirjastojesi lähdekoodiin (jos saatavilla) ja yrittää kaivaa niistä tietoa ajon aikana esim. debuggerilla. En oikein pidä hyvänä ideana, mutta saahan sitä yrittää.

C++:ssa on eräitä paljon käytettyjä tekniikoita, joita voi rajatusti matkai C-kielen puolella. Lyhyet esittelyt:

http://www.hackcraft.net/raii/
http://www.scicomp.ucsd.edu/~peg/papers/iotrdoc/reference_counting.html

Jos et voi jotakin tehdä omassa kielessäsi automaattisesti, voit tehdä sen huolellisesti käsin ja saada jotain tekniikan etuja käyttöösi. Muista testata ahkerasti...

Radikaalimpi ratkaisu on Boehmin roskienkerääjä.

http://www.hpl.hp.com/personal/Hans_Boehm/gc/

Siinä resurssit voi vapauttaa finalisoijien avulla.

Muissa kielissä on muita tekniikoita. C-kielen valinnut saa tottua tekemään monta asiaa itse käsin, mutta omapa on valintansa :-)

firebug [06.02.2007 12:38:59]

#

Tuossa edellä tulikin jo hyvää asiaa. En jaksanut noita linkkejä vilkaista läpi kuin pintapuolisesti, mutta näin ainakin itse toteutin joskus muistinhallinan:

Ensiksi loin luokan, joka pitää kirjaa muistin varauksesta ja sisältää staattiset metodit muistin varaamiselle/vapauttamiselle. Olkoon tämä luokka nimeltään vaikka MemoryAllocator. Siitä ei voida luoda olioita, sillä se sisältää vain staattisia jäseniä ja alustaja sekä tuhoaja ovat yksityisiä. Lisäksi määrittelin SHeapObject-tietueen, joka sisältää tiedot mm. muistialueen osoitteesta, sen koosta sekä millä rivillä ja missä tiedostossa varaus tapahtui.

Tämän jälkeen ylikirjoitin globaalisti operaattorit new ja delete, jotka sitten kutsuvat MemoryAllocator-luokan staattisia metodeja. Pienellä kikkailulla onnistuu myös rivinumeron/tiedoston nimen/funktion nimen talteenotto new-operaattoria kutsuttaessa, joten vapauttamattomat muistialueet on helpompi jäljittää myöhemmin.

Edit. Ja tämän ratkaisun nopeudesta minulla ei ole tarkempaa tietoa, sillä ainakaan pienissä projekteissa ei ollut ongelmia :) Pitääkin tehdä tänään myöhemmin pikainen nopeustesti. Ja voisihan tuon ehkä julkaista koodivinkeissäkin niin olisi muillekin hyötyä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta