Re: Cteni caroveho kodu v Jave

2009-02-24 Tema obsahu Jindrich Vimr
Zdravim,
zrovna nedavno jsem toto resil, report od uzivatele znel Thinkpad ma
spatnej USB, nefunguje na nem scanner caroveho kodu kterej jinde funguje

Problem - na notebooku byla vypnuta numericka klavesnice, a on na ni
zkousel vytukat ten kod (t.j. 4 = - , 7 = home). Zapnuti
numericke pomohlo, ale pak se na klavesnici nedalo psat pismenka.

Nakonec jsem nasel na webu jak se dany scanner konfiguruje, tento se
konfiguroval pres specialni carove kody v dokumentu ktery bylo potrea
vytisknout. V praci mame jiny, ten se konfiguruje SW cestou.

Ohledne vytukavani byly 3 moznosti: numericka klavesnice (problem s
notebookem), ciselna rada nad klavesami (problem s cestinou) a
vytukavani ascii kodu pres ALT+kod (= reseni)

S pozdravem
Jindra

Petr Burdik wrote:
 Ahoj,
 na notebooku byvava problem v tom, ze tam neni takova ta numericka cast.
 Kdysi jsem se na tom malem vypekl. Protoze jsem si prepinal tu ctecku do
 rezimu numericke klavesnice a porad to nefungovalo. Numericka cast chybela.
 
 Pet
 
 
 Dne Fri, 20 Feb 2009 12:44:45 +0100 Petr Pokorný toneofwi...@gmail.com
 napsal/-a:
 
 Zdravim konferenci,

 Zkousim si cteni caroveho kodu na klavesnicove ctece a System.in skutecne
 vraci kod.


 Ale mam problem na notebooku pres usb redukci, to mi nefunguje.


 Mete nekdo nejakou radu nebo jsou na redukce to ctecky nachylne.


 Diky Petr


 From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On
 Behalf Of Pavel Marek
 Sent: Tuesday, January 20, 2009 7:21 AM
 To: Java
 Subject: Re: Cteni caroveho kodu v Jave


 Není na tom nic záhadnýho.

 Před pár lety jsem dělal program s čtečkou čárových kódů. Čtečka se
 spojila
 kabely s klávesnicí a fungovala přesně jako klávesnice. Takže v
 programu jsi
 byl v okýnku ID zboží, sejmul jsi kód, ten se v té položce objevil a
 ještě
 se to samo odentrovalo. Prostě rozdíl mezi sejmutím čárového kódu a
 napsáním
 toho ID na klávesnici nebyl žádný.

 Není tedy třeba žádná speciální knihovna.


 Pavel Marek.


 __ Informace od ESET Smart Security, verze databaze 3774
 (20090117)
 __


 Tuto zpravu proveril ESET Smart Security.


 http://www.eset.cz

 
 
 


-- 
Jindrich Vimr

E-mail: jv...@softeu.com
Cell: +420 775 638 011,  Phone: +420 371 124 386

SoftEU s.r.o.
Lochotínská 18, 301 00 Plzeň, Czech Republic
Phone +420 371 124 300,Fax: +420 373 729 301


Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Dusan Zatkovsky
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


Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Robert Novotny
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.c...@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/


Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Zdenek Tronicek

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 msk.c...@gmail.com:


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






Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Martin Kuba
Dusan Zatkovsky napsal(a):
 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.

Pokud vím, poslední verze Javy používají generační garbage collector,
popis je třeba tady:
http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Generational_GC_.28aka_Ephemeral_GC.29

Když to zkrátím, tak z paměti je objekt uvolněn nejdřív po té, co na něj
neexistuje odkaz, ale až po té, co daná generace objektů vyčerpá
přidělený prostor, takže živé objekty jsou přesunuty do následující
generace a ukazatel na konec zabraného prostoru je přesunut na začátek.

Makub
-- 
~~
Supercomputing Center Brno Martin Kuba
Institute of Computer Scienceemail: ma...@ics.muni.cz
Masaryk University http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
--



smime.p7s
Description: S/MIME Cryptographic Signature


Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Tomas Studva

Ahoj,
podla mna uz z vasho testovania vyplynulo, ze gc si da namahu uvolnit 
pamat co i len aj po jednom objekte - pripad ked ste nastavil f na null.
Ja som skusil nastavit s na null a dopadlo to podla ocakavania, gc 
zrusil s aj obsiahnute s.foo. Povedat ze gc uvolnuje lokalne 
premenne metod az po opusteni metody je hlupost, lebo potom pamatovo 
narocne metody by zjedli pamat aj keby uvolnovali referencie.


A tak som skusil toto:

   System.out.println(start);
   {
   // vytvorim Foo
   Foo f = new Foo(null);
   // vytvorim pole Stuff
   Stuff[] theStuffs = new Stuff[100];
   for (int i = 0; i  theStuffs.length; i++) {
   theStuffs[i] = new Stuff();
   }
   }
  
   // tu uz neexistuje nic
  
   while ( true ) {

   System.out.println(aaa);
   Runtime.getRuntime().gc();
   try {
   Thread.sleep(200);
   } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
   }


Samozrejme ze gc pracoval a finalizoval. Trochu srandovny bol vystup 
niekde v strede:

finalize Stuff
finalize Stuff
finalize StuffException in thread main java.lang.OutOfMemoryError: 
Java heap space

   at java.lang.ref.Finalizer.register(Unknown Source)
   at java.lang.Object.init(Object.java:20)
   at Foo.init(Foo.java:6)
   at Stuff.init(Stuff.java:3)
   at Stuff.main(Stuff.java:18)

finalize Foo
finalize Foo

Nebudem to analyzovat, lebo to nebol vhodny priklad, pole je predsa 
nieco ine ako lokalne premenne. Spravny priklad by bol vytvorit tu 
metodu s naozaj desattisickami lokalnych premennych(cez makro by to slo).


T.S.


Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Peter Stibrany
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 troni...@fel.cvut.cz:
 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 msk.c...@gmail.com:

 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






Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Zdenek Tronicek
Ja jsem popisoval, jak se chova JVM za normalnich podminek. V  
okamziku, kdy zacne dochazet pamet, zacne JVM drsne optimalizovat. A  
ze to umi, lze videt na tomto prikladu (z Vaseho kodu jsem vypustil  
blok):


System.out.println(start);
// vytvorim Foo
Foo f = new Foo(null);
// vytvorim pole Stuff
Stuff[] theStuffs = new Stuff[10];
for (int i = 0; i  theStuffs.length; i++) {
theStuffs[i] = new Stuff();
}
// nez se dojde sem, je po objektu f
while (true) {
System.out.println(aaa);
Runtime.getRuntime().gc();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

Na mem pocitaci dojde k dealokaci objektu f jeste drive, nez se  
vstoupi do smycky while. Jak k tomu muze dojit? Java neco takoveho  
neumoznuje, jde ciste o optimalizaci JVM.
Mimochodem, myslim, ze tohle je na hranici toho, co jeste lze delat,  
protoze kdyby nejaky program spolehal na to, ze objekt nemuze byt  
dealokovan pred koncem platnosti promenne f (tj. pred koncem metody),  
nebude fungovat.


Pokud jde o ty lokalni promenne, tak ve vypise javap je jejich pocet  
za retezcem Locals= a po dobu vykonavani metody se tato hodnota nemeni.


Z.T.
--
Zdenek Tronicek
Department of Computer Science and Engineering
Prague   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Cituji Tomas Studva tstu...@gmail.com:


Ahoj,
podla mna uz z vasho testovania vyplynulo, ze gc si da namahu  
uvolnit pamat co i len aj po jednom objekte - pripad ked ste  
nastavil f na null.
Ja som skusil nastavit s na null a dopadlo to podla ocakavania, gc  
zrusil s aj obsiahnute s.foo. Povedat ze gc uvolnuje lokalne  
premenne metod az po opusteni metody je hlupost, lebo potom pamatovo  
narocne metody by zjedli pamat aj keby uvolnovali referencie.


A tak som skusil toto:

   System.out.println(start);
   {
   // vytvorim Foo
   Foo f = new Foo(null);
   // vytvorim pole Stuff
   Stuff[] theStuffs = new Stuff[100];
   for (int i = 0; i  theStuffs.length; i++) {
   theStuffs[i] = new Stuff();
   }
   }
 // tu uz neexistuje nic
 while ( true ) {
   System.out.println(aaa);
   Runtime.getRuntime().gc();
   try {
   Thread.sleep(200);
   } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
   }


Samozrejme ze gc pracoval a finalizoval. Trochu srandovny bol vystup  
niekde v strede:

finalize Stuff
finalize Stuff
finalize StuffException in thread main java.lang.OutOfMemoryError:  
Java heap space

   at java.lang.ref.Finalizer.register(Unknown Source)
   at java.lang.Object.init(Object.java:20)
   at Foo.init(Foo.java:6)
   at Stuff.init(Stuff.java:3)
   at Stuff.main(Stuff.java:18)

finalize Foo
finalize Foo

Nebudem to analyzovat, lebo to nebol vhodny priklad, pole je predsa  
nieco ine ako lokalne premenne. Spravny priklad by bol vytvorit tu  
metodu s naozaj desattisickami lokalnych premennych(cez makro by to  
slo).


T.S.






Re: Kedy dojde k odstraneniu objektu?

2009-02-24 Tema obsahu Tomas Studva
To kedy sa dealokovalo f, zaviselo od velkosti pola, cize ci sa este 
pred cyklom automaticky spustilo gc.


Treba si vsak uvedomit ze kompilator nemoze takmer vobec ovplyvnit 
dealokaciu - ak by bol predposledny prikaz bloku volanie nejakej metody, 
tak uz nik nevie co sa stalo. Nejako vsak ten gc vie ze na f uz nic 
neukazuje, alebo je v inej generacii ako stuff. Napada mi reference 
counting, ale to sa zevraj nepouziva v gc-ckach (viem ale ze ref-count. 
napr. pouziva Cocoa).


Zdenek Tronicek  wrote / napísal(a):
Ja jsem popisoval, jak se chova JVM za normalnich podminek. V 
okamziku, kdy zacne dochazet pamet, zacne JVM drsne optimalizovat. A 
ze to umi, lze videt na tomto prikladu (z Vaseho kodu jsem vypustil 
blok):


System.out.println(start);
// vytvorim Foo
Foo f = new Foo(null);
// vytvorim pole Stuff
Stuff[] theStuffs = new Stuff[10];
for (int i = 0; i  theStuffs.length; i++) {
theStuffs[i] = new Stuff();
}
// nez se dojde sem, je po objektu f
while (true) {
System.out.println(aaa);
Runtime.getRuntime().gc();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

Na mem pocitaci dojde k dealokaci objektu f jeste drive, nez se 
vstoupi do smycky while. Jak k tomu muze dojit? Java neco takoveho 
neumoznuje, jde ciste o optimalizaci JVM.
Mimochodem, myslim, ze tohle je na hranici toho, co jeste lze delat, 
protoze kdyby nejaky program spolehal na to, ze objekt nemuze byt 
dealokovan pred koncem platnosti promenne f (tj. pred koncem metody), 
nebude fungovat.


Pokud jde o ty lokalni promenne, tak ve vypise javap je jejich pocet 
za retezcem Locals= a po dobu vykonavani metody se tato hodnota nemeni.


Z.T.