Avatar billede onkel_satan Nybegynder
28. november 2005 - 18:51 Der er 7 kommentarer og
1 løsning

Garbage collector prioritet.

Jeg har et lille klient/server netværks program. Serveren opretter en thread hver gang en klient vil i kontakt(lave en forespørgsel) med den, hvorefter threaden slettes af garbage colletoren, da run() funktionen løber ud.
Men som jeg kan forstå det er garbage collectoren en deamon thread, og derfor har lav prioritet. Kunne man forstille sig serveren fik saa travlt (worst case) med at oprette nye threads, at garbage collectoren ikke ville kunne komme til at slette de gamle threads da den jo har lavere prioritet. For tilsidst at computeren løber tør for hukommelse ?

Kan man`i så fald tvinge sine threads til at slette sig selv i run() funktionen ?
Avatar billede mwl Nybegynder
28. november 2005 - 19:40 #1
Du kan godt slette et objekt, men så vidt jeg er informeret er garbage collectoren bedre optimeret til dette. System vil ikke kunne løbe fuldstændig tør for hukommelse, da den virtuelle maskine kun har allokeret en hvis mængde hukommelse og du vil få en exception, så der vil altid være plads til GC'eren. Ret mig hvis jeg er forkert på den, men umiddelbart mener jeg ikke du bør være bekymret.

Jeg så et eksempel for .net hvor man oprettede x antal objekter (rigtig mange), og slettede dem "manuelt" og tog tid på dette. Derefter oprettede man samme antal objekter og lod GC'eren ordne sagerne. Sidste forsøg skulle have givet en væsentlig bedre performance, men du kan jo selv forsøge :)
Avatar billede schwarz84 Nybegynder
28. november 2005 - 20:02 #2
Hvad med at bruge en thread pool så dine thread objekter kan genbruges i stedet? Det er nok det der giver den bedste ydelse...

Du kan i øvrigt tvinge garbage collectoren til at køre med et kald til System.gc()
Avatar billede onkel_satan Nybegynder
28. november 2005 - 20:30 #3
mwl: Ja jeg har prøvet at lade den holde threadsne kørende, hvor jeg fik en exception efter den kom op på omkring 1300 threads. Men saa stopper programmet jo oxo, hvilket helst ikke må ske.
Men er lidt nysgerrig om det kan lad sige gøre at komme ud i en situation hvor jeg vil få smidt en exception fordi garbagecollectoren ikke kan komme til for de nye threads.

schwarz84:
Min gruppe kamerat har luftet ideen med at genbruge threds. Men jeg bryder mig generalt ikke om ideen. Hvorfor lægge beslag på f.eks. 400 theads hvis man 90% af tiden kan klare sig med 50 ?. I min tankegang er en dynamisk oprettese/nedlæggelse af threads klart at fortrække da den jo er mere resoursevenlig.
Er der nogen fordel i at have et konstant antal threads ?
Avatar billede schwarz84 Nybegynder
28. november 2005 - 21:12 #4
onkel_satan: Du kan sagtens oprette/nedlægge threads dynamisk med en pool! Hvis du bruger klassen ThreadPoolExecutor (Java 5.0) til at styre din threads, kan du sætte en standardstørrelse (core size) som angiver antallet af threads der som minimum skal være klar til brug (i dit tilfælde for eksempel 50) og et højeste antal samtidige threads, maximum pool size, som angiver det højeste antal threads der kan køres samtidig (dette skulle løse dit problem...)

Klassen Executors gør det ud for et factory som kan bruges til at lave en del anvendelige pools, så du ikke selv skal tænke. Du kunne for eksempel bruge den der hedder newCachedThreadPool(), som genbruger tråde hvor run-metoden er afsluttet og som lukker tråden hvis den ikke har været brugt i 1 min.
En anden mulighed er en pool med fast antal threads med en tilhørende kø (newFixedThreadPool(int nThreads)). Du kan sikkert selv bedømme hvad der passer i dit program...
Avatar billede simonvalter Praktikant
28. november 2005 - 21:13 #5
Man kan ikke tvinge garbage collectoren under java til at garbage collecte med System.gc(). Det er en opfordring som den kan vælge at afvise. Du kan heller ikke slette et objekt men du kan gøre det klar til garbage collection ved at der ikke eksisterer nogen referencer til det.

Hvis det er et thread problem kunne det være du skulle tage og kigge på java.nio, det kan være du kan undgå at oprette så mange tråde.
http://java.sun.com/j2se/1.4.2/docs/guide/nio/

Der er en del options der kan sættes på jvm i forhold til heap garbage collection osv. men det kræver også en del indsigt i hvordan den fungerer og sikkert også en del målinger for at få noget ud af dem.
Avatar billede simonvalter Praktikant
28. november 2005 - 21:14 #6
Avatar billede onkel_satan Nybegynder
28. november 2005 - 21:33 #7
ok takker for jeres svar. ThreadPoolExecutor lyder super smart og bliver nok min løsning.
Avatar billede simonvalter Praktikant
28. november 2005 - 21:51 #8
nok også den hurtigste løsning frem for at f.eks at skifte til nio for at slippe for mange tråde så er der en intro her:
http://www-128.ibm.com/developerworks/java/library/j-javaio/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester