Thread View: nl.comp.programmeren
24 messages
24 total messages
Started by Jo Vermeulen
Fri, 19 Sep 2003 07:55
C# garbage collector
Author: Jo Vermeulen
Date: Fri, 19 Sep 2003 07:55
Date: Fri, 19 Sep 2003 07:55
25 lines
1959 bytes
1959 bytes
Hoi,
Ik had een vraagje. In een C# project (in het compact .NET framework)
vervang ik soms een afbeelding door een andere afbeelding. Ik heb gezien
dat sommige mensen dan eerst dit doen:
if (image != null)
{
image.Dispose();
image = null;
}
Is dat nodig? Ik dacht dat C# garbage collection had. Of dient het enkel
om C# een "hint" te geven dat dit object verwijderd kan worden?
Als het niet nodig is, hoe zit het dan met de complexiteit? Kan ik deze
code beter niet gebruiken of maakt het niet zo zeer uit qua complexiteit?
Mvg,
--
Jo Vermeulen
Student Computer Science at the tUL
email: jo@lumumba.luc.ac.be
www: http://lumumba.luc.ac.be/jo
Re: C# garbage collector
Author: rick
Date: Fri, 19 Sep 2003 10:01
Date: Fri, 19 Sep 2003 10:01
33 lines
2467 bytes
2467 bytes
> Ik had een vraagje. In een C# project (in het compact .NET framework)
> vervang ik soms een afbeelding door een andere afbeelding. Ik heb gezien
> dat sommige mensen dan eerst dit doen:
>
> if (image != null)
> {
> image.Dispose();
> image = null;
> }
>
> Is dat nodig? Ik dacht dat C# garbage collection had. Of dient het enkel
> om C# een "hint" te geven dat dit object verwijderd kan worden?
>
> Als het niet nodig is, hoe zit het dan met de complexiteit? Kan ik deze
> code beter niet gebruiken of maakt het niet zo zeer uit qua complexiteit?
Bovenstaande code is (alleen) nuttig als je 'image' niet langer meer
gebruikt. Als je aan 'image' direct een andere afbeelding 'hangt', bv :
image = mijnAndereImage;
dan heeft het geen enkele zin om (eerst) die code uit te voeren,
dat gebeurt dan al automatisch ('onder water').
Maar, zoals gezegd, als je 'image' niet langer meer gebruikt, dan is die
code WEL nuttig, omdat de garbage collector dan 'ziet' dat dit object
opgeruimd kan worden.
Als je dat niet doet en 'image' is een variabele die niet meer 'out of
scope' raakt tijdens het draaien van het programma (het is bv een
class-variabele (member) van een class die voortdurend 'bestaat',
dan zal 'image' geheugen blijven vasthouden omdat de garbage
collector het object niet kan opruimen.
Re: C# garbage collector
Author: Pieter Philippaerts
Date: Fri, 19 Sep 2003 11:41
Date: Fri, 19 Sep 2003 11:41
47 lines
3338 bytes
3338 bytes
"Jo Vermeulen" <jo@lumumba.luc.ac.be> wrote > Ik had een vraagje. In een C# project (in het compact .NET framework) > vervang ik soms een afbeelding door een andere afbeelding. Ik heb gezien > dat sommige mensen dan eerst dit doen: > Is dat nodig? Ik dacht dat C# garbage collection had. Of dient het enkel > om C# een "hint" te geven dat dit object verwijderd kan worden? Alle klassen in de .NET runtime die zogenaamde unmanaged resoruces encapsuleren hebben ofwel een Dispose ofwel een Close methode. De reden hiervoor is dat de garbage collector maar af en toe uitgevoerd wordt en dit kan problemen opleveren met sommige unmanaged resources. Neem bijvoorbeeld een File. FileStream fs = File.Open(.., FileShare.None); fs.Read(...); fs = null; // rest van code Het probleem met bovenstaande code is dat het bestand open blijft totdat de GC aangeroepen wordt [wat potentieel een hele tijd kan duren]. Dit wil zeggen dat andere programma's die dat bestand willen openen gewijgerd worden, omdat je file sharing op None hebt gezet. Volgende code is een stuk beter: FileStream fs = File.Open(.., FileShare.None); fs.Read(...); fs.Close(); // rest van code Bovenstaande code gaat het bestand sluiten zodra het niet meer nodig is. Het is duidelijk dat bovenstaand geval enkel van toepassing is voor bestanden, maar er zijn nog andere redenen om unmanaged resources zo snel mogelijk vrij te geven. Zo hebben de oudere Windows platformen [98, ME, misschien ook NT4] een vrij beperkte set van handles en zo ongeveer elke unmanaged resource [buiten geheugen] gebruikt zo'n handles. Het is dus duidelijk dat als je 10000 images opent zonder ze te sluiten dat je image handles wel eens op kunnen geraken voordat de eerste image handles door de GC terug vrijgegeven worden. Een derde reden die in jouw geval van toepassing is is geheugengebruik. Images kunnen heel wat geheugen innemen en dus is het misschien wel een goed idee om dat geheugen zo snel mogelijk terug vrij te geven. MVg, Pieter Philippaerts
Re: C# garbage collector
Author: Gerrit Cornelis
Date: Fri, 19 Sep 2003 11:54
Date: Fri, 19 Sep 2003 11:54
38 lines
2840 bytes
2840 bytes
<rick@nomail.net> wrote in message
news:3vklmvsj3lsprdrvjrplk7rcknecl8f967@4ax.com...
> > Ik had een vraagje. In een C# project (in het compact .NET framework)
> > vervang ik soms een afbeelding door een andere afbeelding. Ik heb gezien
> > dat sommige mensen dan eerst dit doen:
> >
> > if (image != null)
> > {
> > image.Dispose();
> > image = null;
> > }
> >
> > Is dat nodig? Ik dacht dat C# garbage collection had. Of dient het enkel
> > om C# een "hint" te geven dat dit object verwijderd kan worden?
> >
> > Als het niet nodig is, hoe zit het dan met de complexiteit? Kan ik deze
> > code beter niet gebruiken of maakt het niet zo zeer uit qua
complexiteit?
>
> Bovenstaande code is (alleen) nuttig als je 'image' niet langer meer
> gebruikt. Als je aan 'image' direct een andere afbeelding 'hangt', bv :
>
> image = mijnAndereImage;
>
> dan heeft het geen enkele zin om (eerst) die code uit te voeren,
> dat gebeurt dan al automatisch ('onder water').
zonder veel te kennen van c# denk ik dat het sturen van de Dispose wel nodig
is, of in ieder geval netter is, als je het image object niet meer gaat
gebruiken. Een Image object kan externe resources vasthouden en je weet
nooit zeker wanneer die gaan gereleased worden als je het niet expliciet
doet (garbage collection gebeurt wanneer de run time environment ertoe
beslist, niet wanneer jij het wil). ik heb er geen idee van of de garbage
collector op het moment van memory reclaim ook nog een dispose doet.
misschien wel, maar het is niet netjes van externe resources vast te houden.
en voor hetzelfde geld wordt het stuk geheugen van dat object nooit
gereclaimed.
Re: C# garbage collector
Author: rick
Date: Fri, 19 Sep 2003 12:56
Date: Fri, 19 Sep 2003 12:56
51 lines
3530 bytes
3530 bytes
>> > Ik had een vraagje. In een C# project (in het compact .NET framework)
>> > vervang ik soms een afbeelding door een andere afbeelding. Ik heb gezien
>> > dat sommige mensen dan eerst dit doen:
>> >
>> > if (image != null)
>> > {
>> > image.Dispose();
>> > image = null;
>> > }
>> >
>> > Is dat nodig? Ik dacht dat C# garbage collection had. Of dient het enkel
>> > om C# een "hint" te geven dat dit object verwijderd kan worden?
>> >
>> > Als het niet nodig is, hoe zit het dan met de complexiteit? Kan ik deze
>> > code beter niet gebruiken of maakt het niet zo zeer uit qua
>complexiteit?
>>
>> Bovenstaande code is (alleen) nuttig als je 'image' niet langer meer
>> gebruikt. Als je aan 'image' direct een andere afbeelding 'hangt', bv :
>>
>> image = mijnAndereImage;
>>
>> dan heeft het geen enkele zin om (eerst) die code uit te voeren,
>> dat gebeurt dan al automatisch ('onder water').
>
>zonder veel te kennen van c# denk ik dat het sturen van de Dispose wel nodig
>is, of in ieder geval netter is, als je het image object niet meer gaat
>gebruiken. Een Image object kan externe resources vasthouden en je weet
>nooit zeker wanneer die gaan gereleased worden als je het niet expliciet
>doet (garbage collection gebeurt wanneer de run time environment ertoe
>beslist, niet wanneer jij het wil). ik heb er geen idee van of de garbage
>collector op het moment van memory reclaim ook nog een dispose doet.
>misschien wel, maar het is niet netjes van externe resources vast te houden.
>en voor hetzelfde geld wordt het stuk geheugen van dat object nooit
>gereclaimed.
Dat is toch precies wat ik zei ? 'Bovenstaande code is (alleen) nuttig als
je 'image' niet langer meer gebruikt. '
Bovendien ging ik daarna nog het ��n en ander wat meer toelichten,
maar net dat stukje tekst heb je in deze reply weggeknipt (...) :
'Maar, zoals gezegd, als je 'image' niet langer meer gebruikt, dan is die
code WEL nuttig, omdat de garbage collector dan 'ziet' dat dit object
opgeruimd kan worden.
Als je dat niet doet en 'image' is een variabele die niet meer 'out of
scope' raakt tijdens het draaien van het programma (het is bv een
class-variabele (member) van een class die voortdurend 'bestaat',
dan zal 'image' geheugen blijven vasthouden omdat de garbage
collector het object niet kan opruimen.'
Re: C# garbage collector
Author: Gerrit Cornelis
Date: Fri, 19 Sep 2003 13:39
Date: Fri, 19 Sep 2003 13:39
53 lines
3737 bytes
3737 bytes
<rick@nomail.net> wrote in message
news:bvulmv8hmij7ul4cf9ph8m5799mmls1b79@4ax.com...
> >> > Ik had een vraagje. In een C# project (in het compact .NET framework)
> >> > vervang ik soms een afbeelding door een andere afbeelding. Ik heb
gezien
> >> > dat sommige mensen dan eerst dit doen:
> >> >
> >> > if (image != null)
> >> > {
> >> > image.Dispose();
> >> > image = null;
> >> > }
> >> >
<knip>
>
> >zonder veel te kennen van c# denk ik dat het sturen van de Dispose wel
nodig
> >is, of in ieder geval netter is, als je het image object niet meer gaat
> >gebruiken. Een Image object kan externe resources vasthouden en je weet
> >nooit zeker wanneer die gaan gereleased worden als je het niet expliciet
> >doet (garbage collection gebeurt wanneer de run time environment ertoe
> >beslist, niet wanneer jij het wil). ik heb er geen idee van of de garbage
> >collector op het moment van memory reclaim ook nog een dispose doet.
> >misschien wel, maar het is niet netjes van externe resources vast te
houden.
> >en voor hetzelfde geld wordt het stuk geheugen van dat object nooit
> >gereclaimed.
>
> Dat is toch precies wat ik zei ? 'Bovenstaande code is (alleen) nuttig als
> je 'image' niet langer meer gebruikt. '
>
> Bovendien ging ik daarna nog het ��n en ander wat meer toelichten,
> maar net dat stukje tekst heb je in deze reply weggeknipt (...) :
>
> 'Maar, zoals gezegd, als je 'image' niet langer meer gebruikt, dan is die
> code WEL nuttig, omdat de garbage collector dan 'ziet' dat dit object
> opgeruimd kan worden.
>
> Als je dat niet doet en 'image' is een variabele die niet meer 'out of
> scope' raakt tijdens het draaien van het programma (het is bv een
> class-variabele (member) van een class die voortdurend 'bestaat',
> dan zal 'image' geheugen blijven vasthouden omdat de garbage
> collector het object niet kan opruimen.'
Volgens mij ging de vraag over waarom je Dispose() expliciet moet sturen en
niet over het op null zetten van de variabele. De post van Pieter bevat een
veel betere uitleg dan de mijne maar komt op hetzelfde neer. en ik kan mij
natuurlijk vergissen en misschien ging de vraag over de null assignatie aan
de image variabele en dan is die inderdaad onnodig voor de garbage collector
maar wel veel netter want je hebt het Image object net onbruikbaar gemaakt.
bijgevolg maak je het beter ook onbereikbaar.
Gerrit
Re: C# garbage collector
Author: Ramon Smits
Date: Fri, 19 Sep 2003 22:58
Date: Fri, 19 Sep 2003 22:58
47 lines
2599 bytes
2599 bytes
Pieter Philippaerts wrote:
> Een derde reden die in jouw geval van toepassing is is geheugengebruik.
> Images kunnen heel wat geheugen innemen en dus is het misschien wel een goed
> idee om dat geheugen zo snel mogelijk terug vrij te geven.
De garbage collector gaat pas ruimen nadat er daadwerkelijk het systeem
bijna geen fysiek vrij geheugen meer is of bij een method call op de
garbage collector GC.Collect().
Dit gebeurd omdat dit een kostbare aangelegenheid is.
Tegenwoordig hebben nieuwe computers 512 of 1024MB geheugen. Dat duurt
echt wel even voor dat vol is en heel leuk om dit gedrag ook echt terug
te zien.
De dispose zoals eerder in deze thread is vermeld dient inderdaad voor
het opruimen van unmanaged resources zoals handles.
Dit kan op global scope inderdaad als
if(o!=null)
{
o.Dispose();
o=null;
}
Op localscope kun je in C# ook het using statement gebruiken
using(o = new O())
{
}
Bij het verlaten van de using scope word automatisch de Dispose
aangeroepen. /Ook/ als in de using scope een exception optreed.
Perfect voorbeeld daarvoor is de DataRepeater.
M.v.g.,
Ramon
--
Ramon Smits aka. Exyll
http://www.exyll.net/ (ipv6 enabled)
Re: C# garbage collector
Author: Serve La
Date: Sat, 20 Sep 2003 08:05
Date: Sat, 20 Sep 2003 08:05
31 lines
2453 bytes
2453 bytes
"Ramon Smits" <exyll@hotmail.com> wrote in message news:3f6b8a0a$0$197$e4fe514c@dreader3.news.xs4all.nl... > Pieter Philippaerts wrote: > > > Een derde reden die in jouw geval van toepassing is is geheugengebruik. > > Images kunnen heel wat geheugen innemen en dus is het misschien wel een goed > > idee om dat geheugen zo snel mogelijk terug vrij te geven. > > > De garbage collector gaat pas ruimen nadat er daadwerkelijk het systeem > bijna geen fysiek vrij geheugen meer is Dat vind ik nogal moeilijk te geloven en dat gedrag zie ik ook helemaal niet in een testprogje van mij. > Dit gebeurd omdat dit een kostbare aangelegenheid is. Wat? > Tegenwoordig hebben nieuwe computers 512 of 1024MB geheugen. Dat duurt > echt wel even voor dat vol is en heel leuk om dit gedrag ook echt terug > te zien. Dat wil nog niet zeggen dat alle programma's ineens asociaal veel geheugen moeten gebruiken. Ook met 512mb zit processen elkaar snel in de weg. Stel, je hebt een tekstverwerker, mailprogramma, ontwikkelomgeving en een tekenprogramma openstaan die zich allemaal zo gedragen. Dan zit je met je eeuwig thrashende 512meg 3GHZ te koekeloeren alsof je een P100/32mb hebt.
Re: C# garbage collector
Author: Andreas Sikkema
Date: Sat, 20 Sep 2003 08:59
Date: Sat, 20 Sep 2003 08:59
11 lines
1729 bytes
1729 bytes
Serve La wrote: > Stel, je hebt een tekstverwerker, mailprogramma, ontwikkelomgeving en een > tekenprogramma openstaan die zich allemaal zo gedragen. Dan zit je met je > eeuwig thrashende 512meg 3GHZ te koekeloeren alsof je een P100/32mb hebt. Als je het zo bekijkt is een GC dus eng. En alleen maar een speeltje voor foute programmeurs ;-) -- Andreas
Re: C# garbage collector
Author: Ramon Smits
Date: Sat, 20 Sep 2003 09:28
Date: Sat, 20 Sep 2003 09:28
52 lines
3492 bytes
3492 bytes
Serve La wrote: >>De garbage collector gaat pas ruimen nadat er daadwerkelijk het systeem >>bijna geen fysiek vrij geheugen meer is > > Dat vind ik nogal moeilijk te geloven en dat gedrag zie ik ook helemaal niet > in een testprogje van mij. Tsja... low on memory misschien :). Wat doet je test applicatie om dit na te bootsen? WinForm applicaties gaan ook garbagecollecten bij een minimize als ik me niet vergis... >>Dit gebeurd omdat dit een kostbare aangelegenheid is. > > Wat? Garbage collecten... Je 'heap' groeit namelijk enorm. Als de garbage collector gaat ruimen dan heb je ook brokken geheugen die verplaatst moeten worden. De GC moet zeg maar de 'heap' gaan defragmenteren. Daarom moet je in je code eigenlijk nooit GC.Collect() aanroepen. > Dat wil nog niet zeggen dat alle programma's ineens asociaal veel geheugen > moeten gebruiken. Dat zeg ik ook niet :). It's all about design. Waarom een object continu creeeren en destroyen als je weet dat je die actie per uur 1 miljoen maal moet doen. Dan is het nuttig dergelijke objecten te cachen. Maar dat is eigenlijk altijd al geweest. > Ook met 512mb zit processen elkaar snel in de weg. > Stel, je hebt een tekstverwerker, mailprogramma, ontwikkelomgeving en een > tekenprogramma openstaan die zich allemaal zo gedragen. Dan zit je met je > eeuwig thrashende 512meg 3GHZ te koekeloeren alsof je een P100/32mb hebt. Inderdaad een bulk aan applicaties die veel geheugen nodig hebben. Maar dat zijn piek momenten. Je tekstverwerken is niet continu met een spellingscontrole bezig en je ontwikkelomgeving niet continu aan het compileren en je tekenprogramma niet continu een batch aan beeldbewerkingen. Als een applicatie veel geheugen nodig heeft wil dit niet zeggen dat die applicatie dat geheugen ook continu nodig heeft. Zet anders maar eens 30 applicaties open met data. Je zult zien dat de applicatie die de focus heeft gewoon goed performed ondanks dat je systeemgeheugen toch echt op is. -- Ramon Smits aka. Exyll http://www.exyll.net/ (ipv6 enabled)
Re: C# garbage collector
Author: Marco van de Voort
Date: Sat, 20 Sep 2003 09:52
Date: Sat, 20 Sep 2003 09:52
45 lines
3460 bytes
3460 bytes
In article <3f6c1dd6$0$135$e4fe514c@dreader4.news.xs4all.nl>, Ramon Smits wrote: > Serve La wrote: > >> Dat wil nog niet zeggen dat alle programma's ineens asociaal veel geheugen >> moeten gebruiken. > > Dat zeg ik ook niet :). It's all about design. Waarom een object continu > creeeren en destroyen als je weet dat je die actie per uur 1 miljoen > maal moet doen. Dan is het nuttig dergelijke objecten te cachen. Maar > dat is eigenlijk altijd al geweest. Als ze in een freelist zitten voor een bepaalde grootte, zijn ze al gecollect. Dus gecachete allocaties tellen niet mee in je applicatie geheugen gebruik. (tenzij je VM/heapmanager ze niet freed als de memory low watermark gehaald wordt ) >> Ook met 512mb zit processen elkaar snel in de weg. >> Stel, je hebt een tekstverwerker, mailprogramma, ontwikkelomgeving en een >> tekenprogramma openstaan die zich allemaal zo gedragen. Dan zit je met je >> eeuwig thrashende 512meg 3GHZ te koekeloeren alsof je een P100/32mb hebt. > > Inderdaad een bulk aan applicaties die veel geheugen nodig hebben. Maar > dat zijn piek momenten. Gebruik maar eens JBuilder als ontwikkelgebeuren. Je leven is dan een groot piekmoment met 512MB, nog onafhankelijk van de rest :-) > Je tekstverwerken is niet continu met een > spellingscontrole ;bezig en je ontwikkelomgeving niet continu aan het > compileren en je tekenprogramma niet continu een batch aan > beeldbewerkingen. Maar de vertraging die uitswappen kost tijdens gewoon werken (en b.v. eens in de 10/20 minuten switches) is IMHO ook al fout, dat werkt al niet lekker meer als ie dan 10 seconden gaat trashen, om even iets in de documentatie te cut and pasten. > Als een applicatie veel geheugen nodig heeft wil dit > niet zeggen dat die applicatie dat geheugen ook continu nodig heeft. Zet > anders maar eens 30 applicaties open met data. Je zult zien dat de > applicatie die de focus heeft gewoon goed performed ondanks dat je > systeemgeheugen toch echt op is. De applicaties die genoemd werden zijn allemaal interactief. Voor slapende services kan ik het me nog voorstellen.
Re: C# garbage collector
Author: Ramon Smits
Date: Sat, 20 Sep 2003 11:53
Date: Sat, 20 Sep 2003 11:53
61 lines
4215 bytes
4215 bytes
Marco van de Voort wrote: >>Dat zeg ik ook niet :). It's all about design. Waarom een object continu >>creeeren en destroyen als je weet dat je die actie per uur 1 miljoen >>maal moet doen. Dan is het nuttig dergelijke objecten te cachen. Maar >>dat is eigenlijk altijd al geweest. > > Als ze in een freelist zitten voor een bepaalde grootte, zijn ze al > gecollect. Dus gecachete allocaties tellen niet mee in je applicatie > geheugen gebruik. (tenzij je VM/heapmanager ze niet freed als de memory > low watermark gehaald wordt ) Wat is een freelist? Een lijst van alle recources waar geen references vanuit de applicatie meer staan? Inderdaad... de tresshold bepaald wanneer de garbage collector gaan handelen. Maar dan moet inderdaad wel die tresshold behaald worden tijdens het draaien van de betreffende applicatie. Een cache word nooit vrijgegeven. Dat is nou het mooie van een cache. Uiteraard telt die WEL mee met je applicatie geheugen gebruik. Aangezien de objecte in de betreffende cache snel oud worden gaat de .NET GC ze overslaan omdat deze in een oudere generatie komen. De .NET GC is zo slim om dan niet bij elke GC cycle die objecten te checken omdat ze waarschijnlijk nog steeds niet gecollect kunnen worden. >>Je tekstverwerken is niet continu met een >>spellingscontrole ;bezig en je ontwikkelomgeving niet continu aan het >>compileren en je tekenprogramma niet continu een batch aan >>beeldbewerkingen. > > > Maar de vertraging die uitswappen kost tijdens gewoon werken (en b.v. eens > in de 10/20 minuten switches) is IMHO ook al fout, dat werkt al niet lekker > meer als ie dan 10 seconden gaat trashen, om even iets in de documentatie > te cut and pasten. Inderdaad.. dat is ook vrij irritant. Garbage collecten wil je ook op die momenten doen zodra de betreffende applicatie idle is. Dat doet de VM in Java en .NET maar een C++ applicatie heeft dergelijke functionaliteit vaak niet omdat het een hels karwij is. De gebruiker merkt vaak deze opschoon acties dan ook vaak helemaal niet in Java en .NET. Het enige wat de gebruiker merkt is het jit compileren van de code. Maar zolang systeem geheugen nog riant beschikbaar is is garbage collecten nog helemaal niet nodig. Dat is wat ik duidelijk probeer te maken. De .NET VM zal dat dan ook niet snel doen. > De applicaties die genoemd werden zijn allemaal interactief. Voor slapende > services kan ik het me nog voorstellen. Wat kun je je voorstellen? Dat die idle zijn? Interactieve applicatie zijn ook net zo vaak idle. M.v.g., Ramon -- Ramon Smits aka. Exyll http://www.exyll.net/ (ipv6 enabled)
Re: C# garbage collector
Author: Marco van de Voort
Date: Sat, 20 Sep 2003 12:08
Date: Sat, 20 Sep 2003 12:08
72 lines
4864 bytes
4864 bytes
In article <3f6c3fca$0$59340$e4fe514c@dreader8.news.xs4all.nl>, Ramon Smits wrote: > Marco van de Voort wrote: > >>>Dat zeg ik ook niet :). It's all about design. Waarom een object continu >>>creeeren en destroyen als je weet dat je die actie per uur 1 miljoen >>>maal moet doen. Dan is het nuttig dergelijke objecten te cachen. Maar >>>dat is eigenlijk altijd al geweest. >> >> Als ze in een freelist zitten voor een bepaalde grootte, zijn ze al >> gecollect. Dus gecachete allocaties tellen niet mee in je applicatie >> geheugen gebruik. (tenzij je VM/heapmanager ze niet freed als de memory >> low watermark gehaald wordt ) > > Wat is een freelist? Een lijst van alle recources waar geen references > vanuit de applicatie meer staan? Een lijst met gedealloceerde (GC of handmatig) geheugen bereiken. Meestal van een bepaalde grootte categorie. Soms zijn ze meervoudig gesorteerd. (op grote en op volgorde, sorteren op volgorde maakt mergen van aansluitende blokken makkelijker) Dit om compacting en merging makkelijker te maken. De freelist zijn dus gecachte stukjes geheugen, geen echte objecten meer. (al kan dat als optimalisatie evt in sommige talen toegevoegd worden) > Inderdaad... de tresshold bepaald wanneer de garbage collector gaan > handelen. Maar dan moet inderdaad wel die tresshold behaald worden > tijdens het draaien van de betreffende applicatie. Mijn punt was dat geheugen dat nog niet geGCed is, niet hergebruikt wordt. Ik reageerde op die opmerking over "geheugen cachen", maar ik zie nu dat jij dat misschien "handmatig' (zelf) cachen heb bedoeld, terwijl ik caching in the memorymanager van de taal bedoelde. >> Maar de vertraging die uitswappen kost tijdens gewoon werken (en b.v. eens >> in de 10/20 minuten switches) is IMHO ook al fout, dat werkt al niet lekker >> meer als ie dan 10 seconden gaat trashen, om even iets in de documentatie >> te cut and pasten. > > Inderdaad.. dat is ook vrij irritant. Garbage collecten wil je ook op > die momenten doen zodra de betreffende applicatie idle is. Dat doet de > VM in Java en .NET maar een C++ applicatie heeft dergelijke > functionaliteit vaak niet omdat het een hels karwij is. Ik weet dat het onder delphi vermoedelijk wel kan, en van C++ ben ik ook redelijk zeker. Al valt dat dan onder de non-cooperative languages. waar je dus in de GC geen gealloceert geheugen kan laten verplaatsen, hetgeen tot fragmentatie. Maar mark en sweep zijn universeel, en een thread en event driven applicaties bestaan in die beide talen ook. > De gebruiker merkt vaak deze opschoon acties dan ook vaak helemaal niet in > Java en .NET. Het enige wat de gebruiker merkt is het jit compileren van > de code. Ik weet dat niet. Er waren vroeger veel problemen mee, maar ik weet niet of deze opgelost zijn door nieuwere, betere VMs, of door zwaardere machines met meer geheugen (en dat dan ook relatief tot de last). > Maar zolang systeem geheugen nog riant beschikbaar is is garbage > collecten nog helemaal niet nodig. Dat is wat ik duidelijk probeer te > maken. De .NET VM zal dat dan ook niet snel doen. > >> De applicaties die genoemd werden zijn allemaal interactief. Voor slapende >> services kan ik het me nog voorstellen. > > Wat kun je je voorstellen? Dat die idle zijn? Interactieve applicatie > zijn ook net zo vaak idle. Dat uitswappen niet problematisch is. Voor een applicatie die weinig gebruikt wordt, maar toch regelmatig (iedere zoveel minuten b.v.) kan het erg irritant zijn.
Re: C# garbage collector
Author: Serve La
Date: Sat, 20 Sep 2003 13:01
Date: Sat, 20 Sep 2003 13:01
43 lines
3234 bytes
3234 bytes
"Ramon Smits" <exyll@hotmail.com> wrote in message news:3f6c1dd6$0$135$e4fe514c@dreader4.news.xs4all.nl... > Serve La wrote: > > >>De garbage collector gaat pas ruimen nadat er daadwerkelijk het systeem > >>bijna geen fysiek vrij geheugen meer is > > > > Dat vind ik nogal moeilijk te geloven en dat gedrag zie ik ook helemaal niet > > in een testprogje van mij. > > Tsja... low on memory misschien :). Wat doet je test applicatie om dit > na te bootsen? in een timer event geheugen alloceren. Ik zie geen vollopen van het geheugen tot het bijna vol is (gelukkig) > > Dat wil nog niet zeggen dat alle programma's ineens asociaal veel geheugen > > moeten gebruiken. > > Dat zeg ik ook niet :). It's all about design. Waarom een object continu > creeeren en destroyen als je weet dat je die actie per uur 1 miljoen > maal moet doen. Dan is het nuttig dergelijke objecten te cachen. Maar > dat is eigenlijk altijd al geweest. Wat ik bedoelde is dat al die programma's wel ergens geheugen alloceren. Als een GC zo werkt dat ie op gaat ruimen als het fysieke geheugen vol is heb je nog steeds een traag systeem ondankds dat je 512/1024mb hebt. Maar zo werkt de .NET GC ook niet. > Inderdaad een bulk aan applicaties die veel geheugen nodig hebben. Maar > dat zijn piek momenten. Je tekstverwerken is niet continu met een > spellingscontrole bezig en je ontwikkelomgeving niet continu aan het > compileren en je tekenprogramma niet continu een batch aan > beeldbewerkingen. Als een applicatie veel geheugen nodig heeft wil dit > niet zeggen dat die applicatie dat geheugen ook continu nodig heeft. Zet > anders maar eens 30 applicaties open met data. Je zult zien dat de > applicatie die de focus heeft gewoon goed performed ondanks dat je > systeemgeheugen toch echt op is. Maar dat heeft allemaal niks met GC te maken, meer met virtueel geheugen.
Re: C# garbage collector
Author: Pieter Philippaerts
Date: Sat, 20 Sep 2003 15:05
Date: Sat, 20 Sep 2003 15:05
47 lines
3440 bytes
3440 bytes
"Ramon Smits" <exyll@hotmail.com> wrote > >>De garbage collector gaat pas ruimen nadat er daadwerkelijk het systeem > >>bijna geen fysiek vrij geheugen meer is Eerst en vooral moet je een onderscheid maken tussen de verschillende garbage collectors van .NET. Zo gebruiken client applicaties een andere GC dan server applicaties. De client GC gaat typisch vaken collecten en zichzelf dus vaker uitvoeren. Het voordeel is dat de gebruik altijd wel wat geheugen vrij heeft om bijvoorbeeld nieuwe [eventueel unmanaged] applicaties te starten. De server GC gaat minder vaak collecten [=> higher throughput voor uw server apps] maar gebruikt dan ook het geheugen veel minder conservatief. > WinForm applicaties gaan ook garbagecollecten bij een minimize als ik me > niet vergis... Neen, het enige wat Windows doet als je een applicatie minimalizeert is de working set verkleinen, maar dat doet hij bij alle applicaties, managed of unmanaged. Probeer maar eens met je nieuwslezer: hier bij mij gaat de working set van Outlook Express van 21Mb naar 1Mb door te minimalizeren. > > Dat wil nog niet zeggen dat alle programma's ineens asociaal veel geheugen > > moeten gebruiken. > Dan is het nuttig dergelijke objecten te cachen. Maar > dat is eigenlijk altijd al geweest. Ik ben ook eerder van de mening om geheugen zo snel mogelijk vrij te geven als dat gaat -- in managed of unmanaged programmas. Dat caching dat je daar aanhaalt is niet altijd mogelijk -- het lijkt me al bijvoorbeeld al niet mogelijk in de situatie van de OP waar hij met tekeningen werkt. > [..] en je ontwikkelomgeving niet continu aan het > compileren is [..] Duidelijk nog niet met VB.NET gewerkt ;-) > Je zult zien dat de > applicatie die de focus heeft gewoon goed performed ondanks dat je > systeemgeheugen toch echt op is. Kan misschien ook zijn omdat the Windows threading scheduler een groter thread quantum geeft aan de actieve applicatie. Mvg, Pieter Philippaerts
Re: C# garbage collector
Author: Serve La
Date: Sat, 20 Sep 2003 17:49
Date: Sat, 20 Sep 2003 17:49
24 lines
2431 bytes
2431 bytes
"Pieter Philippaerts" <Pieter@nospam.mentalis.org> wrote in message news:1064070298.157895@seven.kulnet.kuleuven.ac.be... > "Ramon Smits" <exyll@hotmail.com> wrote > Neen, het enige wat Windows doet als je een applicatie minimalizeert is de > working set verkleinen, maar dat doet hij bij alle applicaties, managed of > unmanaged. Probeer maar eens met je nieuwslezer: hier bij mij gaat de > working set van Outlook Express van 21Mb naar 1Mb door te minimalizeren. Zijn er ook manieren om dit te voorkomen in je eigen apps? > Ik ben ook eerder van de mening om geheugen zo snel mogelijk vrij te geven > als dat gaat -- in managed of unmanaged programmas. Het ligt aan de app natuurlijk, maar dat weet je zelf ook wel. > > Je zult zien dat de > > applicatie die de focus heeft gewoon goed performed ondanks dat je > > systeemgeheugen toch echt op is. > > Kan misschien ook zijn omdat the Windows threading scheduler een groter > thread quantum geeft aan de actieve applicatie. En het voorgrond proces krijgt een priority boost.
Re: C# garbage collector
Author: Pieter Philippaerts
Date: Sat, 20 Sep 2003 20:23
Date: Sat, 20 Sep 2003 20:23
13 lines
2127 bytes
2127 bytes
"Serve La" <ik@veranderhetal.com> wrote > > Neen, het enige wat Windows doet als je een applicatie minimalizeert is de > > working set verkleinen, maar dat doet hij bij alle applicaties, managed of > > unmanaged. > > Zijn er ook manieren om dit te voorkomen in je eigen apps? Waarom zou je dat willen? En ja, je kan het voorkomen door al je memory pages te locken. Probleem is natuurlijk dat als iedereen alles begint te locken dat Windows dan niets meer kan uitswappen.
Re: C# garbage collector
Author: Marco van de Voort
Date: Sun, 21 Sep 2003 09:37
Date: Sun, 21 Sep 2003 09:37
19 lines
2184 bytes
2184 bytes
In article <1064089426.115340@seven.kulnet.kuleuven.ac.be>, Pieter Philippaerts wrote: > "Serve La" <ik@veranderhetal.com> wrote >> > Neen, het enige wat Windows doet als je een applicatie minimalizeert is > de >> > working set verkleinen, maar dat doet hij bij alle applicaties, managed > of >> > unmanaged. >> >> Zijn er ook manieren om dit te voorkomen in je eigen apps? > > Waarom zou je dat willen? Een control appje dat altijd responsive moet zijn b.v. > En ja, je kan het voorkomen door al je memory pages te locken. Probleem is > natuurlijk dat als iedereen alles begint te locken dat Windows dan niets > meer kan uitswappen. Dat klopt.
Re: C# garbage collector
Author: Ramon Smits
Date: Sun, 21 Sep 2003 12:10
Date: Sun, 21 Sep 2003 12:10
34 lines
2819 bytes
2819 bytes
Serve La wrote: > Wat ik bedoelde is dat al die programma's wel ergens geheugen alloceren. Als > een GC zo werkt dat ie op gaat ruimen als het fysieke geheugen vol is heb je > nog steeds een traag systeem ondankds dat je 512/1024mb hebt. Maar zo werkt > de .NET GC ook niet. Nee.. de GC gaat ruimen als het geheugen *bijna* vol is. Dus nog voor het systeem low on memory kuren gaat vertonen. Als er altijd vrij geheugen is dan blijft het je systeem heerlijk draaien. >>Inderdaad een bulk aan applicaties die veel geheugen nodig hebben. Maar >>dat zijn piek momenten. Je tekstverwerken is niet continu met een >>spellingscontrole bezig en je ontwikkelomgeving niet continu aan het >>compileren en je tekenprogramma niet continu een batch aan >>beeldbewerkingen. Als een applicatie veel geheugen nodig heeft wil dit >>niet zeggen dat die applicatie dat geheugen ook continu nodig heeft. Zet >>anders maar eens 30 applicaties open met data. Je zult zien dat de >>applicatie die de focus heeft gewoon goed performed ondanks dat je >>systeemgeheugen toch echt op is. > > > Maar dat heeft allemaal niks met GC te maken, meer met virtueel geheugen. Klopt! Maar ik wilde alleen aangeven dat je systeem er niet langzamer van gaat draaien als alle idle applicaties veel geheugen geallocceerd hebben. M.v.g., Ramon -- Ramon Smits aka. Exyll http://www.exyll.net/ (ipv6 enabled)
Re: C# garbage collector
Author: Ramon Smits
Date: Sun, 21 Sep 2003 12:14
Date: Sun, 21 Sep 2003 12:14
23 lines
2055 bytes
2055 bytes
Pieter Philippaerts wrote: > Neen, het enige wat Windows doet als je een applicatie minimalizeert is de > working set verkleinen, maar dat doet hij bij alle applicaties, managed of > unmanaged. Probeer maar eens met je nieuwslezer: hier bij mij gaat de > working set van Outlook Express van 21Mb naar 1Mb door te minimalizeren. Het is een testje waard... >>[..] en je ontwikkelomgeving niet continu aan het >>compileren is [..] > > Duidelijk nog niet met VB.NET gewerkt ;-) Ik bedoelde compileren in non idle cycles :) M.v.g., Ramon -- Ramon Smits aka. Exyll http://www.exyll.net/ (ipv6 enabled)
Re: C# garbage collector
Author: Serve La
Date: Sun, 21 Sep 2003 12:29
Date: Sun, 21 Sep 2003 12:29
14 lines
1833 bytes
1833 bytes
"Ramon Smits" <exyll@hotmail.com> wrote in message news:3f6d9632$0$131$e4fe514c@dreader5.news.xs4all.nl... > > M.v.g., > Ramon > > -- > Ramon Smits aka. Exyll > http://www.exyll.net/ (ipv6 enabled) Hoe heb je trouwens je server met ipv6 geconfigureerd? Ik heb een tijdje terug een lib gemaakt met ipv6 maar kon niet vinden hoe je IIS (op XP pro) met ipv6 kon laten werken
Re: C# garbage collector
Author: Ramon Smits
Date: Sun, 21 Sep 2003 21:27
Date: Sun, 21 Sep 2003 21:27
18 lines
2088 bytes
2088 bytes
Serve La wrote: > Hoe heb je trouwens je server met ipv6 geconfigureerd? Ik heb een tijdje > terug een lib gemaakt met ipv6 maar kon niet vinden hoe je IIS (op XP pro) > met ipv6 kon laten werken IIS op XP is geen IIS6. IIS6 ondersteund ipv6 en die zit bij Windows 2003. Onder XP is het waarschijnlijk wel mogelijk een 6to4 mapping aan te maken naar de 80 poort. Oftewel je ipv6 adres op poort 80 laten forwarden naar je ipv4 poort 80 poort. Je kan dan alleen niet achterhalen welke hosts je IIS service benaderen. -- Ramon Smits aka. Exyll http://www.exyll.net/ (ipv6 enabled)
Re: C# garbage collector
Author: Henk H
Date: Mon, 22 Sep 2003 05:48
Date: Mon, 22 Sep 2003 05:48
20 lines
1918 bytes
1918 bytes
> De garbage collector gaat pas ruimen nadat er daadwerkelijk het systeem > bijna geen fysiek vrij geheugen meer is of bij een method call op de > garbage collector GC.Collect(). Dat geld alleen voor antieke GC's. Die van .NET is wel een beetje beter. > Dit gebeurd omdat dit een kostbare aangelegenheid is. En ook dat valt tegenwoordig wel mee. dotNET gebruikt een systeem met 3 'generaties' van objecten zodat vlottend spul vrijwel onmiddelijk wordt opgeruimd maar langlevende objecten maar sporadisch hoeven te worden gecontroleerd. De opmerkingen over image = null; en MyFile.close(); blijven natuurlijk wel geldig. -hh-
Re: C# garbage collector
Author: Chris_V
Date: Mon, 22 Sep 2003 09:31
Date: Mon, 22 Sep 2003 09:31
29 lines
1897 bytes
1897 bytes
Jo Vermeulen wrote:
> Hoi,
>
> Ik had een vraagje. In een C# project (in het compact .NET framework)
> vervang ik soms een afbeelding door een andere afbeelding. Ik heb gezien
> dat sommige mensen dan eerst dit doen:
>
> if (image != null)
> {
> image.Dispose();
> image = null;
> }
>
> Is dat nodig? Ik dacht dat C# garbage collection had. Of dient het enkel
> om C# een "hint" te geven dat dit object verwijderd kan worden?
>
> Als het niet nodig is, hoe zit het dan met de complexiteit? Kan ik deze
> code beter niet gebruiken of maakt het niet zo zeer uit qua complexiteit?
>
> Mvg,
>
Is het ook niet consistenter om te spreken van een .NET garbage collector
ipv een C# garbage collector????
mvg
Chris
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads