Kedy dojde k odstraneniu objektu?
Robert Novotny
robert.novotny na upjs.sk
Úterý Únor 24 17:23:48 CET 2009
Garbage collector funguje nedeterministicky a v zavislosti od
implementacie.
Inak povedane,
* neda sa zarucit jeho spustenie
* System.gc() je len navrh, ze ma zbehnut.
Letmy pohlad do dokumentacie podla mna nikde nehovori, ze premenna,
ktora vypadla zo scope MUSI byt zgarbagecollectovana.
Pokial mojmu zraku neusiel memory leak, tak by som jednoducho povedal,
ze GC usudil, ze kvoli dvom smiesnym instanciam nema zmysel
spustat GC masineriu.
RN
On Tue, 24 Feb 2009 17:04:45 +0100, Dusan Zatkovsky <msk.conf na gmail.com>
wrote:
> 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.
>
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Další informace o konferenci Konference