Dobry den,

nedavno ma zaujimal podobny problem (ale v mojom pripade sa metoda
vzapati po local=null; skoncila) a uvazoval som nad tym, ci local=null
pomoze garbage collectoru alebo nie.
(http://stackoverflow.com/questions/473685) Spolu s diskutujucimi sme
sa zhodli, ze v mojom uvedenom pripade to nepomoze. Avsak to co pisete
dava zmysel, a ukazalo mi ze aj 'nullovanie' lokalnych premennych ma v
istych okrajovych pripadoch opodstatnenie. Pridal som priklad podla
vasho vysvetlenia do diskusie
(http://stackoverflow.com/questions/473685#583387). Vdaka za
prispevok.

S pozdravom,

-Peter Stibrany
// www.foglyn.com //

2009/2/24 Zdenek Tronicek <[email protected]>:
> Dobry den,
>
> myslim, ze pokud chcete porozumet tomu, proc nebyl objekt foo odstranen z
> pameti, je nutne se trochu podivat na bytecode. V Jave funguje alokace
> lokalnich promennych tak, ze pri VSTUPU DO METODY se na zasobniku naalokuje
> prostor dostatecne velky na to, aby se tam vesly vsechny promenne
> deklarovane v teto metode. Tento prostor se deli na tzv. sloty. Kazdy slot
> ma 32 bitu. Promenne typu byte, char, short, int, boolean, float a reference
> zabiraji 1 slot, double a long 2 sloty.
> No a kazda lokalni promenna je pak identifikovana cislem slotu.
> Pro GC je dulezite to, ze prostor pro lokalni promenne existuje po celou
> dobu vykonavani metody. Tzn., ze i kdyz opustime blok, v nemz byla promenna
> deklarovana, neznamena to, ze je fyzicky (v pameti) zrusena.
> Jinymi slovy: ukazatel na objekt vytvoreny prikazem new Foo(null); je ulozen
> v nekterem slotu a GC nepozna, ze jej muze dealokovat, protoze nema
> informaci o tom, ktere sloty jsou aktualne pouzivane.
>
> Principialne by bylo mozne, aby prekladac generoval pri opusteni bloku
> instrukce pro nulovani vsech slotu, do nichz byly ulozeny promenne lokalni v
> tomto bloku, ale sunovsky javac to nedela a rekl bych, ze to nedelaji ani
> jine prekladace. Ve vyjimecnych pripadech by to sice pomohlo, vetsinou by to
> vsak byl znacny overhead.
>
> Z.T.
> --
> Zdenek Tronicek
> Department of Computer Science and Engineering
> Prague                   tel: +420 2 2435 7410
> http://cs.felk.cvut.cz/~tronicek
>
>
> Cituji Dusan Zatkovsky <[email protected]>:
>
>> Ahoj.
>>
>> Kedze som v jave novy a prechadzam do nej z C++, obcas sa pri programovani
>> pozastavim nad nejakou vecou, o ktorej viem, ze tak nejak funguje, ale aby
>> som mal pokojne spanie, musim si to osahat vlastnymi rukami.
>>
>> Prave som napisal nejaku class-u, ktora obaluje urcite podclassy a
>> poskutyje
>> urcitu ucelenu funkcionalitu. Tie jej podclassy rozne ukazuju sami do
>> seba,
>> medzi sebou a tak podobne, proste o sebe vedia. A tak sa mi hlavou zacali
>> tocit otazky okolo garbage collectoru, platnosti objektov, case ich
>> uvolnenia
>> z pamati a tak podobne.
>>
>> A kedze som bol byvalym kolegom ( zdravim Ta Nhac :) ) presviedsany, ze
>> reci
>> okolo javy a jej pamatovej nenazranosti su nezmysly, vyrobil som si rovno
>> maly test:
>>
>> // obycajna class-a. Vypisom testujem cas jej odstranenia z pamati
>> // urdzuje odkaz na svoju nadradenu classu, pretoze obe budem nejak
>> // zapuzdrovat do jedneho celku a vyuzivaju medzi sebou svoje sluzby
>>
>> public class Foo {
>>
>>    private Stuff stuff;
>>
>>    public Foo ( Stuff s ) {
>>        this.stuff = s;
>>    }
>>
>>   �...@override
>>    protected void finalize() {
>>        System.out.println("finalize Foo");
>>    }
>> }
>>
>>
>> // nejaka dalsia classa
>> public class Stuff {
>>
>>    public Foo foo = new Foo ( this );
>>
>>   �...@override
>>    protected void finalize() {
>>        System.out.println("finalize Stuff");
>>    }
>> }
>>
>>
>> public static void main(String[] args) {
>>
>>        System.out.println("start");
>>        {
>>            // vytvorim Foo
>>            Foo f = new Foo(null);
>>            // vytvorim Stuff, ten si vytvori dalsie Foo
>>            Stuff s = new Stuff();
>>            // f = null
>>        }
>>
>>        // tu uz neexistuje ani Foo f, ani Stuff f, mozu byt zmazane
>>
>>        while ( true ) {
>>                System.out.println("aaa");
>>                Runtime.getRuntime().gc();
>>                Thread.sleep(2000);
>>        }
>>    }
>> }
>>
>>
>> Kupodivu, vystupom programu bol nasledovny vypis:
>>        start
>>        aaa
>>        aaa
>>        aaa
>>        ...
>>
>> Po pol hodine som to nechapajuc breakol.
>>
>> Odkomentoval som to "f = null"
>>
>> Vystup:
>>        start
>>        aaa
>>        finalize Foo
>>        aaa
>>        aaa
>>        aaa
>>        ...
>>
>> Toto som nechal bezat par minut. Garbage collector ten Stuff nie a nie
>> zmazat.
>>
>> Priznam sa, ze to uplne nechapem, pretoze za prvou zlozenou zatvorkou }
>> straca "Stuff s" platnost a nema dovod viac existovat v pamati.
>>
>> Mna by zaujimalo, kedy ho gc uvolni, pretoze pokial bude mat Stuff 2GB,
>> bude
>> aplikacia bezdovodne kradnut systemu 2GB pamati na bordel, ktory uz nikdy
>> nepouzije, boh vie na aku dlhu dobu.
>>
>> Diky.
>>
>> --
>> Dusan
>>
>
>
>

Odpovedet emailem