/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
nedlæggelse af tråd
Fra : Søren Hjelholt


Dato : 16-06-02 00:06

Hej NG

Jeg har et lille problem...
Jeg har en simpel server der modatager noget indput fra nogle Applets, og
sørger for at lagre data i en database mv. Den arbejde med tråde for at
kunne håndtere flere klienter samtidig, og fungere som sådab ok. Men
hvordan f.... får jeg den til at nedlægge tråden igen, jeg kan se at der
blever allokeret mere hukommelse hver gang der bliver lavet en
forbindelse, men tilsyneladende dør tråden ikke når klienten afsluttes.
Jeg har prøvet at lave det således at tråden lukker alt ned den bruger,
men lige lidt hjælper det. Hvordan kan jeg sørge for at tråden afslutter,
og frigiver evt. hukommelse?

mvh.
    Søren Hjelholt

 
 
Martin Ehmsen (16-06-2002)
Kommentar
Fra : Martin Ehmsen


Dato : 16-06-02 00:37

On Sun, 16 Jun 2002 01:06:26 +0200, Søren Hjelholt wrote:

> Jeg har en simpel server der modatager noget indput fra nogle Applets,
> og sørger for at lagre data i en database mv. Den arbejde med tråde for
> at kunne håndtere flere klienter samtidig, og fungere som sådab ok. Men
> hvordan f.... får jeg den til at nedlægge tråden igen, jeg kan se at der
> blever allokeret mere hukommelse hver gang der bliver lavet en
> forbindelse, men tilsyneladende dør tråden ikke når klienten afsluttes.
> Jeg har prøvet at lave det således at tråden lukker alt ned den bruger,
> men lige lidt hjælper det. Hvordan kan jeg sørge for at tråden
> afslutter, og frigiver evt. hukommelse?

Der er lidt løse ender i dit indlæg (kode er altid godt. Specielt din
run() metode for dine tråde).
Skal disse klient-tråde gerne nedlægge sig selv, når forbindelsen lukkes,
eller skal serveren have mulighed for stoppe dem?
Hvordan starter du dine tråde og hvordan ser selve trådene ud?
Trådene burde forsvinde når du afslutter din run() metode. Husker du at
sørge for at run() metoden afslutter når din klient ikke vil lege med
mere??

Martin
--
I sort through my snail mail and crack open the BOFH Monthly Newsletter,
"kill -9" and check out the articles therein. There's a nice peice of
making OS2 slow, boring and painful, but it looks exactly like the OS2
installation instructions to me... Ah, who knows.
   BOFH

Daniel Jacobsen (16-06-2002)
Kommentar
Fra : Daniel Jacobsen


Dato : 16-06-02 20:23

Hejsa!

Tråde (implements Thread) i Java er lavet sådan, at tråden dræber sig selv,
når run() metoden er løbet igennem. Dvs. at alt det som står i din run()
metode er udført forsvinder tråden. F.eks. i Windows kan du se i
taskmanager, hvor mange tråde dit program bruger. Der kan du holde lidt øje
med det.

Måske skulle du arbejde lidt med din run() metode. Prøv desuden at lave
nogle udskrifter i din tråd. this.activeCount() (eller noget i den stil)
udskriver, hvor mange tråde du har. Hvis der kun bliver lagt flere tråde
til, hver gang en klient logger på og afslutter, er det fordi din run()
metode af en eller anden grund ikke bliver afsluttet.

Mvh Daniel J.



Søren Hjelholt (16-06-2002)
Kommentar
Fra : Søren Hjelholt


Dato : 16-06-02 16:24

"Daniel Jacobsen" <dj@g-a-f.dk> wrote in news:aehore$t8q$1@sunsite.dk in
dk.edb.programmering.java:

> Hejsa!
>
> Tråde (implements Thread) i Java er lavet sådan, at tråden dræber sig
> selv, når run() metoden er løbet igennem. Dvs. at alt det som står i
> din run() metode er udført forsvinder tråden. F.eks. i Windows kan du
> se i taskmanager, hvor mange tråde dit program bruger. Der kan du holde
> lidt øje med det.
>
> Måske skulle du arbejde lidt med din run() metode. Prøv desuden at lave
> nogle udskrifter i din tråd. this.activeCount() (eller noget i den
> stil) udskriver, hvor mange tråde du har. Hvis der kun bliver lagt
> flere tråde til, hver gang en klient logger på og afslutter, er det
> fordi din run() metode af en eller anden grund ikke bliver afsluttet.
>

Takker for info, jeg leger lidt videre med det...

mvh.
   Søren Hjelholt

Steen Jorgensen (16-06-2002)
Kommentar
Fra : Steen Jorgensen


Dato : 16-06-02 19:19

Som du måske ved, er der automatisk Garbage Collection i Java, som
fjerner objerter, incl. threads, som der ikke længere er referencer til.

Det "automatiske" lader sig til en vis grad styre med kaldet af den
statiske metode System.gc(), som får garbagecollectoren til at køre.

Det kan du prøve at lege lidt med hvis du har lyst!

Iøvrigt er det vist altid - selv med automatisk gc - en god ide at
sætte object = null, når du ikke skal bruge det mere.

Mvh. Steen



"Søren Hjelholt" <hjelholt@_nospam_mail.dk> wrote in message
news:Xns922FB11874586hjelholtmaildk@193.88.15.201...
> "Daniel Jacobsen" <dj@g-a-f.dk> wrote in news:aehore$t8q$1@sunsite.dk in
> dk.edb.programmering.java:
>
> > Hejsa!
> >
> > Tråde (implements Thread) i Java er lavet sådan, at tråden dræber sig
> > selv, når run() metoden er løbet igennem. Dvs. at alt det som står i
> > din run() metode er udført forsvinder tråden. F.eks. i Windows kan du
> > se i taskmanager, hvor mange tråde dit program bruger. Der kan du holde
> > lidt øje med det.
> >
> > Måske skulle du arbejde lidt med din run() metode. Prøv desuden at lave
> > nogle udskrifter i din tråd. this.activeCount() (eller noget i den
> > stil) udskriver, hvor mange tråde du har. Hvis der kun bliver lagt
> > flere tråde til, hver gang en klient logger på og afslutter, er det
> > fordi din run() metode af en eller anden grund ikke bliver afsluttet.
> >
>
> Takker for info, jeg leger lidt videre med det...
>
> mvh.
> Søren Hjelholt



Martin Ehmsen (16-06-2002)
Kommentar
Fra : Martin Ehmsen


Dato : 16-06-02 19:03

On Sun, 16 Jun 2002 20:19:08 +0200, Steen Jorgensen wrote:

> Som du måske ved, er der automatisk Garbage Collection i Java, som
> fjerner objerter, incl. threads, som der ikke længere er referencer til.

En tråd er jo netop noget kode, som skal køre "for sig selv". Dvs. at her
har Garbage Collection ikke noget at skulle sige. Bare fordi du I din
parent-tråd ikke længere har nogen reference til din tråd, betyder ikke
at den vil blive fjernet. Hvis det var/er tilfældet, så ville du udlukke
en masse gode programmer fra at blive skrevet.

> Det "automatiske" lader sig til en vis grad styre med kaldet af den
> statiske metode System.gc(), som får garbagecollectoren til at køre.

System.gc() får _IKKE_ garbagecollectoren til at køre. Du beder blot pænt
Java om at forsøge at køre Garbage collectoren, hvis den kan.
Dvs. at du efter et kald til System.gc() ikke kan være sikker på at
garbagecollectoren har kørt!

Mvh
Martin

PS. Vil du ikke godt skrive under det du svarer på, da det fremmer
forståelsen meget. Se evt. http://www.usenet.dk

Steen Jorgensen (16-06-2002)
Kommentar
Fra : Steen Jorgensen


Dato : 16-06-02 20:05


"Martin Ehmsen" <thames@get2net.dk> wrote in message
news:pan.2002.06.16.20.03.16.782863.1584@get2net.dk...
> On Sun, 16 Jun 2002 20:19:08 +0200, Steen Jorgensen wrote:
>
> > Som du måske ved, er der automatisk Garbage Collection i Java, som
> > fjerner objerter, incl. threads, som der ikke længere er referencer til.
>
> En tråd er jo netop noget kode, som skal køre "for sig selv". Dvs. at her
> har Garbage Collection ikke noget at skulle sige. Bare fordi du I din
> parent-tråd ikke længere har nogen reference til din tråd, betyder ikke
> at den vil blive fjernet. Hvis det var/er tilfældet, så ville du udlukke
> en masse gode programmer fra at blive skrevet.
>

Det forhindrer jo ikke, at en tråd osse er et objekt, som skabes og skal
fjernes igen, når det er "udløbet"!

> > Det "automatiske" lader sig til en vis grad styre med kaldet af den
> > statiske metode System.gc(), som får garbagecollectoren til at køre.
>
> System.gc() får _IKKE_ garbagecollectoren til at køre. Du beder blot pænt
> Java om at forsøge at køre Garbage collectoren, hvis den kan.
> Dvs. at du efter et kald til System.gc() ikke kan være sikker på at
> garbagecollectoren har kørt!
>

Jeg skrev til en vis grad!
Java-docs om System.gc(): "Runs the garbage collector"!

> Mvh
> Martin
>
> PS. Vil du ikke godt skrive under det du svarer på, da det fremmer
> forståelsen meget. Se evt. http://www.usenet.dk

Hvis du læste tråden var det da vist klart nok, var det ikke?

Elsker positive indlæg, der på ingen måde blot vil belære
mig om ligegyldigheder!

Mvh. Steen



Ulrik Magnusson (16-06-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 16-06-02 19:25



Steen Jorgensen wrote:

> "Martin Ehmsen" <thames@get2net.dk> wrote in message
> news:pan.2002.06.16.20.03.16.782863.1584@get2net.dk...
> > On Sun, 16 Jun 2002 20:19:08 +0200, Steen Jorgensen wrote:
> >
> > > Som du måske ved, er der automatisk Garbage Collection i Java, som
> > > fjerner objerter, incl. threads, som der ikke længere er referencer til.
> >
> > En tråd er jo netop noget kode, som skal køre "for sig selv". Dvs. at her
> > har Garbage Collection ikke noget at skulle sige. Bare fordi du I din
> > parent-tråd ikke længere har nogen reference til din tråd, betyder ikke
> > at den vil blive fjernet. Hvis det var/er tilfældet, så ville du udlukke
> > en masse gode programmer fra at blive skrevet.
>
> Det forhindrer jo ikke, at en tråd osse er et objekt, som skabes og skal
> fjernes igen, når det er "udløbet"!

Jeg misforstår dig måske, men Thread objektets levetid styres ikke af
trådens levetid:

class T extends Thread
{
static void printThreads()
{
//10 er rent gætværk og forhåbentligt mange nok -
//Thread.activeCount() kan alligevel ændre sig,
// og det er vel ikke til at komme uden om?
Thread[] threads = new Thread[10];
int count = Thread.enumerate( threads );
System.out.println("Tråde: " + count );
for( int i = 0; i < count; i++ )
{
System.out.println( "\t" + threads[i] );
}
}

public void run()
{
printThreads();
}

public static void main( String[] args )
{
T t = new T();
printThreads();
t.start(); // tråden startes
while( t.isAlive() )
{
// vent til tråden er løbet færdig..
}
// nu skulle tråden være død
printThreads();
// men Thread objektet t eksisterer stadig
System.out.println("t: " + t);
}
}

- omvendt kan Thread objekter selvfølgelig ikke "garbagecollectes"
før en eventuel tråd er kørt færdig.

Ulrik Magnusson



> > PS. Vil du ikke godt skrive under det du svarer på, da det fremmer
> > forståelsen meget. Se evt. http://www.usenet.dk
> Hvis du læste tråden var det da vist klart nok, var det ikke?
> Elsker positive indlæg, der på ingen måde blot vil belære
> mig om ligegyldigheder!

*host host*

Ulrik Magnusson


Steen Jorgensen (16-06-2002)
Kommentar
Fra : Steen Jorgensen


Dato : 16-06-02 20:47


"Ulrik Magnusson" <ulrikm@yahoo.com> wrote in message
news:3D0CD7E1.D2351A40@yahoo.com...
>
>
> Steen Jorgensen wrote:
>
> > "Martin Ehmsen" <thames@get2net.dk> wrote in message
> > news:pan.2002.06.16.20.03.16.782863.1584@get2net.dk...
> > > On Sun, 16 Jun 2002 20:19:08 +0200, Steen Jorgensen wrote:
> > >
> > > > Som du måske ved, er der automatisk Garbage Collection i Java, som
> > > > fjerner objerter, incl. threads, som der ikke længere er referencer
til.
> > >
> > > En tråd er jo netop noget kode, som skal køre "for sig selv". Dvs. at
her
> > > har Garbage Collection ikke noget at skulle sige. Bare fordi du I din
> > > parent-tråd ikke længere har nogen reference til din tråd, betyder
ikke
> > > at den vil blive fjernet. Hvis det var/er tilfældet, så ville du
udlukke
> > > en masse gode programmer fra at blive skrevet.
> >
> > Det forhindrer jo ikke, at en tråd osse er et objekt, som skabes og skal
> > fjernes igen, når det er "udløbet"!
>
> Jeg misforstår dig måske, men Thread objektets levetid styres ikke af
> trådens levetid:
>
> class T extends Thread
> {
> static void printThreads()
> {
> //10 er rent gætværk og forhåbentligt mange nok -
> //Thread.activeCount() kan alligevel ændre sig,
> // og det er vel ikke til at komme uden om?
> Thread[] threads = new Thread[10];
> int count = Thread.enumerate( threads );
> System.out.println("Tråde: " + count );
> for( int i = 0; i < count; i++ )
> {
> System.out.println( "\t" + threads[i] );
> }
> }
>
> public void run()
> {
> printThreads();
> }
>
> public static void main( String[] args )
> {
> T t = new T();
> printThreads();
> t.start(); // tråden startes
> while( t.isAlive() )
> {
> // vent til tråden er løbet færdig..
> }
> // nu skulle tråden være død
> printThreads();
> // men Thread objektet t eksisterer stadig
> System.out.println("t: " + t);
> }
> }
>
> - omvendt kan Thread objekter selvfølgelig ikke "garbagecollectes"
> før en eventuel tråd er kørt færdig.
>

Ja "t" eksisterer endnu, men som jeg forstod det oprindelige
spørgsmål var problemet mere at få fjernet de - i dit kode-
eksempel - 10 i "t" instatierede Threads, når de har gjort hvad
de skulle.
Og der er vel ikke noget i vejen for, at du kunne "fremskynde" en
garbage collection af dem fra "t", når du ved de er udløbet. (Det
ved du selvfølgelig ikke altid, men med et fornuftigt design vil du
nok kunne få den information - i en realistisk applikation
fx. med callback tilbage til "t").

Mvh. Steen


> Ulrik Magnusson
>
>
>
> > > PS. Vil du ikke godt skrive under det du svarer på, da det fremmer
> > > forståelsen meget. Se evt. http://www.usenet.dk
> > Hvis du læste tråden var det da vist klart nok, var det ikke?
> > Elsker positive indlæg, der på ingen måde blot vil belære
> > mig om ligegyldigheder!
>
> *host host*
>
> Ulrik Magnusson
>



Ulrik Magnusson (16-06-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 16-06-02 20:04

Steen Jorgensen wrote:

> Ja "t" eksisterer endnu, men som jeg forstod det oprindelige
> spørgsmål var problemet mere at få fjernet de - i dit kode-
> eksempel - 10 i "t" instatierede Threads, når de har gjort hvad
> de skulle.
> Og der er vel ikke noget i vejen for, at du kunne "fremskynde" en
> garbage collection af dem fra "t", når du ved de er udløbet. (Det
> ved du selvfølgelig ikke altid, men med et fornuftigt design vil du
> nok kunne få den information - i en realistisk applikation
> fx. med callback tilbage til "t").

Jeg tror det kan gøre stor nytte at tænke på Thread objekter som
almindelige "garbage collectede" objekter og tråde som noget helt
andet. Tråde er noget som kører koden bestemt af en run()
metoden og når run() terminerer, terminerer tråden - i dét
øjeblik eksisterer Thread objektet stadig - lige indtil næste
garbage collection, med mindre der stadig eksisterer referencer
til Thread objektet.

(i eksemplet er der kun 2 instantierede Thread objekter -
"main()" og t - i eksemplet kører main() hele tiden og t kun
noget af tiden - t eksisterer dog længere end _tråden_ t
kører.)

Ulrik Magnusson


Steen Jorgensen (16-06-2002)
Kommentar
Fra : Steen Jorgensen


Dato : 16-06-02 21:36


"Ulrik Magnusson" <ulrikm@yahoo.com> wrote in message
news:3D0CE108.D349732F@yahoo.com...
> Steen Jorgensen wrote:
>
> > Ja "t" eksisterer endnu, men som jeg forstod det oprindelige
> > spørgsmål var problemet mere at få fjernet de - i dit kode-
> > eksempel - 10 i "t" instatierede Threads, når de har gjort hvad
> > de skulle.
> > Og der er vel ikke noget i vejen for, at du kunne "fremskynde" en
> > garbage collection af dem fra "t", når du ved de er udløbet. (Det
> > ved du selvfølgelig ikke altid, men med et fornuftigt design vil du
> > nok kunne få den information - i en realistisk applikation
> > fx. med callback tilbage til "t").
>
> Jeg tror det kan gøre stor nytte at tænke på Thread objekter som
> almindelige "garbage collectede" objekter og tråde som noget helt
> andet. Tråde er noget som kører koden bestemt af en run()
> metoden og når run() terminerer, terminerer tråden - i dét
> øjeblik eksisterer Thread objektet stadig - lige indtil næste
> garbage collection, med mindre der stadig eksisterer referencer
> til Thread objektet.
>
> (i eksemplet er der kun 2 instantierede Thread objekter -
> "main()" og t - i eksemplet kører main() hele tiden og t kun
> noget af tiden - t eksisterer dog længere end _tråden_ t
> kører.)
>
> Ulrik Magnusson
>

Det er da vist rigtig! Jeg læste dit eksempel lidt skævt, troede
du ville bruge dit threadarray til noget andet end det du jo
faktisk bruger det til, nemlig ...

Du har en thread - main el. hvad det nu kan være. Fra den
thread starter du en række threads, som skal gøre et eller andet
for dig.
(Jeg forstod det oprindelige spørgsmål på den måde, at det
handlede om et standard (ikke-thread-pooled) serverdesign, hvor en
oprindelige
thread ("serveren" - som kører "evigt"), instantierer og starter en ny
thread
til at håndtere hver request der kommer ind, så flere requests kan håndteres
samtidigt. Og spørgsmålet var så: hvordan slipper jeg helt
af med de request-threads igen, når requesten er færdigbehandlet?).
Og i den situation tror jeg stadig, det vil være en mulighed (god ide, hvis
der er ressourceknaphed) at "garbagecollecte" de færdige request-threads.

Mvh. Steen




Martin Ehmsen (17-06-2002)
Kommentar
Fra : Martin Ehmsen


Dato : 17-06-02 01:28

On Sun, 16 Jun 2002 22:36:05 +0200, Steen Jorgensen wrote:

> Og i
> den situation tror jeg stadig, det vil være en mulighed (god ide, hvis
> der er ressourceknaphed) at "garbagecollecte" de færdige
> request-threads.

Det har du ret i. Men pointen er at disse tråde _ikke_ (som Ulrik korrekt
skriver) kan garbagecollectes medmindre at run() metoden er termineret.
Det er derfor vi bliver ved at spørge til om Søren er sikker på at run()
metoden er færdig.
Hvis tråde automatisk blev garbagecollected når man ikke længere har
referencer til dem, så ville alle tråde som bliver starte som:
MinTråd.start(); dø lige efter at metoden hvor MinTråd er defineret
afslutter (eller rettere lige så snart garbage collectoren fanger dem).
Men dette sker netop ikke.
Så kravet til at en tråd kan garbagecollectes er:
- run() metoden er afsluttet.
- Ingen referencer til tråd objeket findes.

Martin

Søren Hjelholt (17-06-2002)
Kommentar
Fra : Søren Hjelholt


Dato : 17-06-02 15:13

Martin Ehmsen <thames@get2net.dk> wrote in
news:pan.2002.06.17.02.27.47.81586.1584@get2net.dk in
dk.edb.programmering.java:

> On Sun, 16 Jun 2002 22:36:05 +0200, Steen Jorgensen wrote:
>
>> Og i
>> den situation tror jeg stadig, det vil være en mulighed (god ide, hvis
>> der er ressourceknaphed) at "garbagecollecte" de færdige
>> request-threads.
>
> Det har du ret i. Men pointen er at disse tråde _ikke_ (som Ulrik korrekt
> skriver) kan garbagecollectes medmindre at run() metoden er termineret.
> Det er derfor vi bliver ved at spørge til om Søren er sikker på at run()
> metoden er færdig.
> Hvis tråde automatisk blev garbagecollected når man ikke længere har
> referencer til dem, så ville alle tråde som bliver starte som:
> MinTråd.start(); dø lige efter at metoden hvor MinTråd er defineret
> afslutter (eller rettere lige så snart garbage collectoren fanger dem).
> Men dette sker netop ikke.
> Så kravet til at en tråd kan garbagecollectes er:
> - run() metoden er afsluttet.
> - Ingen referencer til tråd objeket findes.
>
> Martin

Bare for god ordens skyld, inden alle bliver helt ophidsede :-], så var det
min engen kode der gav lidt problemer, så tråden blev ved med at køre i et
loop hvor den lavede den samme fejl igen og igen, hvilket selvfølgelig kunne
ses på memoryforbruget. Efter lidt rettelser og tests afluttes trådende nu
når run() er kørt færdig, sådan som i rigtigt sagde.
Og for at samle op på diskussionen, så er jeg nogenlunde med på hvad garbage
collection går udpå, men var bare ikke klar over om det også relaterede sig
til tråde. Men da disse også er objekter, ser det ud til at det gør.

mvh.
   Søren Hjelholt

Martin Ehmsen (17-06-2002)
Kommentar
Fra : Martin Ehmsen


Dato : 17-06-02 01:35

On Sun, 16 Jun 2002 21:04:53 +0200, Steen Jorgensen wrote:

> Det forhindrer jo ikke, at en tråd osse er et objekt, som skabes og skal
> fjernes igen, når det er "udløbet"!

Det er klart. Se mit indlæg sidst i denne tråd.

>> System.gc() får _IKKE_ garbagecollectoren til at køre. Du beder blot
>> pænt Java om at forsøge at køre Garbage collectoren, hvis den kan. Dvs.
>> at du efter et kald til System.gc() ikke kan være sikker på at
>> garbagecollectoren har kørt!
>>
>>
> Jeg skrev til en vis grad!
> Java-docs om System.gc(): "Runs the garbage collector"!

Det er netop der pointen _ikke_ er. Må jeg citere:
"gc

public static void gc()

Runs the garbage collector.

Calling the gc method suggests that the Java Virtual Machine expend effort
toward recycling unused objects in order to make the memory they currently
occupy available for quick reuse. When control returns from the method
call, the Java Virtual Machine has made a best effort to reclaim space
from all discarded objects."

Må jeg henlede opmærksomheden på ordet: suggests

>> PS. Vil du ikke godt skrive under det du svarer på, da det fremmer
>> forståelsen meget. Se evt. http://www.usenet.dk
>
> Hvis du læste tråden var det da vist klart nok, var det ikke?

Jo det var, men det er stadig et spørgsmål om god debat-teknik og
almindelige netikette på usenet.

> Elsker positive indlæg, der på ingen måde blot vil belære mig om
> ligegyldigheder!

Jeg synes ikke det ligegyldigheder (og jeg tror ikke jeg er den eneste),
og så elsker jeg sarkastiske indlæg

Mvh
Martin

Steen Jorgensen (17-06-2002)
Kommentar
Fra : Steen Jorgensen


Dato : 17-06-02 10:52


"Martin Ehmsen" <thames@get2net.dk> wrote in message
news:pan.2002.06.17.02.34.42.284689.1584@get2net.dk...
> On Sun, 16 Jun 2002 21:04:53 +0200, Steen Jorgensen wrote:
>
> > Det forhindrer jo ikke, at en tråd osse er et objekt, som skabes og skal
> > fjernes igen, når det er "udløbet"!
>
> Det er klart. Se mit indlæg sidst i denne tråd.
>
> >> System.gc() får _IKKE_ garbagecollectoren til at køre. Du beder blot
> >> pænt Java om at forsøge at køre Garbage collectoren, hvis den kan. Dvs.
> >> at du efter et kald til System.gc() ikke kan være sikker på at
> >> garbagecollectoren har kørt!
> >>
> >>
> > Jeg skrev til en vis grad!
> > Java-docs om System.gc(): "Runs the garbage collector"!
>
> Det er netop der pointen _ikke_ er. Må jeg citere:
> "gc
>
> public static void gc()
>
> Runs the garbage collector.
>
> Calling the gc method suggests that the Java Virtual Machine expend effort
> toward recycling unused objects in order to make the memory they currently
> occupy available for quick reuse. When control returns from the method
> call, the Java Virtual Machine has made a best effort to reclaim space
> from all discarded objects."
>
> Må jeg henlede opmærksomheden på ordet: suggests
>

Det må du gerne. Men - alt andet lige - så vil et System.gc() kald stadig
betyde,
at "garbagecollectoren" kører tidligere end den ellers ville gøre. Og
dermed vil de bundne ressourcer osse blive frigjort tidligere end de ellers
ville være blevet. Og det var lissom det det handlede om.

Mvh. Steen

> >> PS. Vil du ikke godt skrive under det du svarer på, da det fremmer
> >> forståelsen meget. Se evt. http://www.usenet.dk
> >
> > Hvis du læste tråden var det da vist klart nok, var det ikke?
>
> Jo det var, men det er stadig et spørgsmål om god debat-teknik og
> almindelige netikette på usenet.
>
> > Elsker positive indlæg, der på ingen måde blot vil belære mig om
> > ligegyldigheder!
>
> Jeg synes ikke det ligegyldigheder (og jeg tror ikke jeg er den eneste),
> og så elsker jeg sarkastiske indlæg
>
> Mvh
> Martin



Finn Nielsen (17-06-2002)
Kommentar
Fra : Finn Nielsen


Dato : 17-06-02 15:18

"Steen Jorgensen" <seldrup@get2net.dk> writes:

>> Det er netop der pointen _ikke_ er. Må jeg citere:
>> "gc
>>
>> public static void gc()
>>
>> Runs the garbage collector.
>>
>> Calling the gc method suggests that the Java Virtual Machine expend effort
>> toward recycling unused objects in order to make the memory they currently
>> occupy available for quick reuse. When control returns from the method
>> call, the Java Virtual Machine has made a best effort to reclaim space
>> from all discarded objects."
>>
>> Må jeg henlede opmærksomheden på ordet: suggests
>>
>
> Det må du gerne. Men - alt andet lige - så vil et System.gc() kald
> stadig betyde, at "garbagecollectoren" kører tidligere end den ellers
> ville gøre.

Nej.

> Og dermed vil de bundne ressourcer osse blive frigjort tidligere end de
> ellers ville være blevet.

Kun hvis man virkelig er sikker på at garbage collectoren virkelig bliver
kørt tidligere.

Når Martin henleder opmærksomheden på ordet "suggests" er det ikke
tilfældigt. Når man kalder System.gc() giver man JVM'en et hint om at det
måske var en god ide at starte garbage collectoren snart, men der er
absolut ingen garanti for at den gør det. Mig bekendt er det ifølge java
specifikationerne endda lovligt for JVM'en helt at ignorere kald til
System.gc().

Den eneste måde du kan være sikker på at System.gc() har en effekt på dit
system er at læse JVM'ens kode for at se hvad den gør.

--
Finn Nielsen - http://www.zznyyd.dk/

"Creatures seemed to turn up in the world randomly, and certainly not
according to any pictures in a book." - The science of Discworld

Steen Jorgensen (17-06-2002)
Kommentar
Fra : Steen Jorgensen


Dato : 17-06-02 16:30


"Finn Nielsen" <spamtrap1@zznyyd.dk> wrote in message
news:m3ptyqhtup.fsf@mimas.zznyyd.dk...
> "Steen Jorgensen" <seldrup@get2net.dk> writes:
>
> >> Det er netop der pointen _ikke_ er. Må jeg citere:
> >> "gc
> >>
> >> public static void gc()
> >>
> >> Runs the garbage collector.
> >>
> >> Calling the gc method suggests that the Java Virtual Machine expend
effort
> >> toward recycling unused objects in order to make the memory they
currently
> >> occupy available for quick reuse. When control returns from the method
> >> call, the Java Virtual Machine has made a best effort to reclaim space
> >> from all discarded objects."
> >>
> >> Må jeg henlede opmærksomheden på ordet: suggests
> >>
> >
> > Det må du gerne. Men - alt andet lige - så vil et System.gc() kald
> > stadig betyde, at "garbagecollectoren" kører tidligere end den ellers
> > ville gøre.
>
> Nej.
>
> > Og dermed vil de bundne ressourcer osse blive frigjort tidligere end de
> > ellers ville være blevet.
>
> Kun hvis man virkelig er sikker på at garbage collectoren virkelig bliver
> kørt tidligere.
>
> Når Martin henleder opmærksomheden på ordet "suggests" er det ikke
> tilfældigt. Når man kalder System.gc() giver man JVM'en et hint om at det
> måske var en god ide at starte garbage collectoren snart, men der er
> absolut ingen garanti for at den gør det. Mig bekendt er det ifølge java
> specifikationerne endda lovligt for JVM'en helt at ignorere kald til
> System.gc().
>
> Den eneste måde du kan være sikker på at System.gc() har en effekt på dit
> system er at læse JVM'ens kode for at se hvad den gør.
>

Det var derfor jeg skrev "alt andet lige" i mit indlæg.
Ingen "sikkerhed", ingen "garanti", OK, men Sun har formodentlig ikke kodet
System.gc() bare fordi de synes det kunne være sjovt at få udviklere til at
kalde
en funktion, der ikke gjorde noget.

Mvh. Steen




> --
> Finn Nielsen - http://www.zznyyd.dk/
>
> "Creatures seemed to turn up in the world randomly, and certainly not
> according to any pictures in a book." - The science of Discworld



Dennis Thrysøe (18-06-2002)
Kommentar
Fra : Dennis Thrysøe


Dato : 18-06-02 07:32

Steen Jorgensen wrote:
> Det var derfor jeg skrev "alt andet lige" i mit indlæg.
> Ingen "sikkerhed", ingen "garanti", OK, men Sun har formodentlig ikke kodet
> System.gc() bare fordi de synes det kunne være sjovt at få udviklere til at
> kalde
> en funktion, der ikke gjorde noget.

Men Sun er så ikke de eneste der laver JVM'er. Og når andre
implementerer en VM der fokuserer på noget andet, kan de også vælge at
implementere specifikationerne anderledes, hvor det er "tilladt".

F.eks. kunne jeg sagtens forestille mig at en realtime-VM helt ignorerer
kald til System.gc(). Så er man jo selvsagt på den, hvis man har baseret
sit memory-forbrug/ydelse på den.

Samme problemstilling ser man *ofte* i forbindelse med J2EE - her er
også ret mange fortolkninger af specifikationerne

-dennis


Lars Dam (18-06-2002)
Kommentar
Fra : Lars Dam


Dato : 18-06-02 07:41

On Tue, 18 Jun 2002 08:32:09 +0200, Dennis Thrysøe <dt@netnord.dk>
wrote:

>
>F.eks. kunne jeg sagtens forestille mig at en realtime-VM helt ignorerer
>kald til System.gc(). Så er man jo selvsagt på den, hvis man har baseret
>sit memory-forbrug/ydelse på den.

Ved realtime-VM kunne jeg forestille mig det stik modsatte - dvs. der
blev kun GC'et ved dette kald - så kan udvikleren 100% styre hvornår
der blev GC()'et - Altså hvornår VM'em måtte bruge tid på dette. Hvis
man vil kode RT i java vil man aligevel bruge nogle specielle
principper, som f.eks. objekt genbrug, o.l. der gør at GC()'en
sjældent har brug for at blive kaldt, og hvis dette endeligt sker, at
der så ikke er så meget arbejde til den.

Nå, sidespor

>-dennis

vh. ld


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste