>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<
als je het geheugen enzo bedoelt, gewoon alle referenties naar die instantie weghalen. Dus MyClass op null zetten.
Vervolgens haalt de garbage collector 'm (ooit) weg, hoewel er geen tijdsgarantie aan vast zit (volgens mij zelfs geen garantie dat ie uberhaupt wordt vrijgemaakt)
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
1
2
| Test myTest = new Test(); mytest = null; |
Dan wordt het object waar jouw variabele myTest naar verwees een kandidaat voor Garbage Collection. Er zijn geen garanties voor of en wanneer dit gebeurt. Java kent ook geen destructors zoals die in andere talen voorkomen.
Tip: In Java worden namen van classes met een hoofdletter geschreven, namen van variabelen met een kleine...
With the light in our eyes, it's hard to see.
Ik ben meer thuis in Delphi, en daar moet je een zelf gemaakt object ook weer uit het geheugen halen. In Java gebeurt dit dus vanzelf een keer.
>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<
java kent de methode finalize ()Bobco schreef op 13 November 2002 @ 15:40:
Java kent ook geen destructors zoals die in andere talen voorkomen.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Dat zag ik al aan het "free-en" van classesIk ben meer thuis in Delphi
Nee, dit gebeurt direct wanneer ze niet meer nodig zijnIn Java gebeurt dit dus vanzelf een keer.
In het vervolg wel eerst ff goed zoeken he (google, etc)
...maar dat is nauwelijks een "destructor zoals die in andere talen voorkomt" te noemen. Je weet nooit zeker of je destructor aangeroepen wordt en zo ja, wanneer, en of er een logische volgorde in de aanroepen van de destructors zit. Typische toepassingen, zoals een Connection klasse die in de destructor een open socket afsluit, zijn niet met finalize meestal niet goed uit te voeren..oisyn schreef op 13 November 2002 @ 15:44:
java kent de methode finalize ()
Ja, maar die is bedoeld om door de GC aangeroepen te worden als het object inderdaad verwijderd wordt. Omdat je totaal niets weet van de volgorde waarin finalize() wordt aangeroepen op objecten die kandidaat zijn voor Gabage Collection is het niet echt een betrouwbaar mechanisme om resources vrij te geven. Dit artikel op JavaWorld geeft hier wat meer achtergrond over.
Het enige dat je met goed fatsoen kan doen is wat je eigenlijk altijd moet doen: resources vrij geven op het moment dat je ze niet meer nodig hebt. Natuurlijk is dat slecht voor je performance, maar zoals het spreekwoord zegt: "Het kan goed, snel of volledig. Kies er twee..."
With the light in our eyes, it's hard to see.
Nee, dat gebeurt niet direct wanneer ze niet meer nodig zijn. In Java draait een aparte low-priority thread mee bij de executie van het programma, die continue op zoek is naar objecten die opgeruimd mogen worden. In specifieke situaties kan het echter relatief lang duren voordat deze garbage collector de overbodig geworden objecten vindt. Het is dus zeker niet zo dat ze 'direct' opgeruimd worden. (Uiteraard krijgt de garbage collector een hogere prioriteit wanneer het geheugen op dreigt te raken, maar dit terzijde.)Verwijderd schreef op 13 november 2002 @ 15:49:
Nee, dit gebeurt direct wanneer ze niet meer nodig zijnEr zijn meerdere talen waar dit het geval is zoals PHP, etc.
[ Voor 0% gewijzigd door Soultaker op 13-11-2002 15:55 . Reden: d/t-regel is ingewikkeld ]
ridde100:
Nee, dit gebeurt direct wanneer ze niet meer nodig zijnEr zijn meerdere talen waar dit het geval is zoals PHP, etc.
In Java
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
With the light in our eyes, it's hard to see.
Soultaker schreef op 13 november 2002 @ 15:52:
[...]
...maar dat is nauwelijks een "destructor zoals die in andere talen voorkomt" te noemen. Je weet nooit zeker of je destructor aangeroepen wordt en zo ja, wanneer, en of er een logische volgorde in de aanroepen van de destructors zit. Typische toepassingen, zoals een Connection klasse die in de destructor een open socket afsluit, zijn niet met finalize meestal niet goed uit te voeren.
Het is in die zin een destructor dat het wordt aangeroepen als het object wordt gedestruct. Dat je niet weet of en wanneer is een gevolg van het garbage collection systeem in java (wat ik al in de eerste reactie in deze thread zei). Zeggen dat java geen destructor kent vind ik dus onzin. Dat die destructor verder niet echt zinnig is door de manier van garbage collection is weer een ander verhaalBobco schreef op 13 november 2002 @ 15:54 eenzelfde soort verhaal
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ha, discussie!.oisyn schreef op 13 November 2002 @ 15:59:
[...]
[...]
Het is in die zin een destructor dat het wordt aangeroepen als het object wordt gedestruct. Dat je niet weet of en wanneer is een gevolg van het garbage collection systeem in java (wat ik al in de eerste reactie in deze thread zei). Zeggen dat java geen destructor kent vind ik dus onzin. Dat die destructor verder niet echt zinnig is door de manier van garbage collection is weer een ander verhaal
Je kunt als codeklopper in Java simpelweg niet afdwingen dat een object al z'n resources (lees: geheugen) vrij geeft. Dit staat volledig onder controle van de JVM.
Blijft over de stelling over dat er geen expliciete destructor in Java bestaat. De enige manier waarop je finalize() kan laten aanroepen is door alle referenties weg te gooien en dan maar duimen dat de GC 'm pakt...
With the light in our eyes, it's hard to see.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Niet echt mee eens. Laten we een destructor zo defnieren: "de methode wordt uitgevoerd en daarna wordt het object vernietigd".oisyn schreef op 13 november 2002 @ 15:59:
Het is in die zin een destructor dat het wordt aangeroepen als het object wordt gedestruct. Dat je niet weet of en wanneer is een gevolg van het garbage collection systeem in java (wat ik al in de eerste reactie in deze thread zei). Zeggen dat java geen destructor kent vind ik dus onzin. Dat die destructor verder niet echt zinnig is door de manier van garbage collection is weer een ander verhaal
Als ik dan in de api van java ga bladeren vind ik dit bij de finalize() methode van Object:
Dus hoewel finalize() meestal wordt gebruikt als destructor, is het dus mogelijk om in finalize() het object te behouden van desturctie! En dat maakt finalize() dus eigenlijk geen destructor in mijn oogpuntThe finalize method may take any action, including making this object available again to other threads; the usual purpose of finalize, however, is to perform cleanup actions before the object is irrevocably discarded.
(...)
The finalize method of class Object performs no special action; it simply returns normally. Subclasses of Object may override this definition.
NB. let wel op dat finalize() altijd maar 1x wordt aangeroepen. Stel er referenced niets meer naar a en a's finalize() methode zorgt ervoor dat toch wel iets naar a referenced, dan wordt a niet opgeruimd daarna. Mocht er echter daarna ooit geen verwijzing meer bestaan naar a, dan wordt finalize() niet uitgevoerd en a gewoon opgeruimd.
Ik moet m'n muil houwen op IRC
Weer een reden om C++ links te laten liggen.oisyn schreef op 13 November 2002 @ 16:15:
Waarom zou je een destructor expliciet moeten kunnen aanroepen? Dus volgens jou is een private destructor in C++ geen destructor? (je kunt m immers niet aanroepen).
Mja, ik denk dat we wat dat betreft een verschillend gevoel hebben bij de kreet 'destructor'. Ik zie het meer als een aanroep die direct en zonder omwegen een object wegknikkert zonder dat er iets van overblijft.Wat ik onder een destructor versta is een lap code (functie, methode) dat uitgevoerd wordt als een object opgeruimd moet worden. Nou werd ik echter net op de hoogte gebracht door Gliempo () dat je de destruction kunt cancelen door weer een referentie te creeeren naar dit object. Dit wist ik niet, en dit maakt het wel een mindere destructor dan in een taal zoals C++
With the light in our eyes, it's hard to see.
Verwijderd schreef op 13 november 2002 @ 15:49:
Nee, dit gebeurt direct wanneer ze niet meer nodig zijnEr zijn meerdere talen waar dit het geval is zoals PHP, etc.
In het vervolg wel eerst ff goed zoeken he (google, etc)
Garbage collection in php??
Volgens mij bestaat dat nog niet.
Gliempo schreef op 13 november 2002 @ 16:17 een verhaal
dat zeg ik toch:
.oisyn schreef op 13 november 2002 @ 16:15:
[..] Nou werd ik echter net op de hoogte gebracht door Gliempo () dat je de destruction kunt cancelen door weer een referentie te creeeren naar dit object. Dit wist ik niet, en dit maakt het wel een mindere destructor dan in een taal zoals C++
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Omdat C++ access modifiers heeft? Rare reden imho
Het blijft gewoon een destructionfunction imho
Dus als je het niet kan aanroepen is het geen destructor meer? Een destructor is toch gewoon een functie die wordt aangeroepen vlak voordat het object vernietigd gaat worden?Mja, ik denk dat we wat dat betreft een verschillend gevoel hebben bij de kreet 'destructor'. Ik zie het meer als een aanroep die direct en zonder omwegen een object wegknikkert zonder dat er iets van overblijft.
als ik ergens een hekel aan heb dan is het wel het niet weten wanneer of zelfs niet weten OF een object wordt opgeruimd. En als het niet meteen opgeruimd moet worden kan het zo in een queue gegooid worden, geen probleem
Mja, ik denk dat we wat dat betreft een verschillend gevoel hebben bij de kreet 'destructor'. Ik zie het meer als een aanroep die direct en zonder omwegen een object wegknikkert zonder dat er iets van overblijft.
Een destructor gooit een object niet weg, maar ruimt het simpelweg op (dan bedoel ik alles wat het object vasthoudt, maar niet zichzelf). Een destructor in C++ geeft het geheugen dan ook niet vrij (zou ook niet kunnen, aangezien een destructor niet weet of het object op de stack of op de heap is geallocceert)
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Bestaat idd nietACM schreef op 13 november 2002 @ 16:19:
[...]
Garbage collection in php??
Volgens mij bestaat dat nog niet.
ACM schreef op 13 november 2002 @ 16:19:
Garbage collection in php??
Volgens mij bestaat dat nog niet.
Ook PHP kent een vrij simplistische garbage collection, dmv reference counting.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Praktische ervaring doet vermoeden dat zelfs dit niet werkt en als het officieel wel werkt, lijkt het in de praktijk niet tot het serieus opruimen van geheugen te leiden. De meeste wat meer complexere 'applicaties' in PHP gaan steeds meer geheugen gebruiken tot ze crashen. Dat kan natuurlijk ook omdat er elke keer weer een paar cyclische referenties tussen nieuwe objecten ontstaan. Ik betwijfel echter of het nuttig is om reference counting allleen te implementeren: je hebt dan ZOWEL een traag systeem ALS een systeem wat niet voor 100% werkt (en ook niet voor 99%)..oisyn schreef op 14 November 2002 @ 00:19:
Ook PHP kent een vrij simplistische garbage collection, dmv reference counting.
Soultaker schreef op 14 November 2002 @ 02:25:
Praktische ervaring doet vermoeden dat zelfs dit niet werkt en als het officieel wel werkt, lijkt het in de praktijk niet tot het serieus opruimen van geheugen te leiden. De meeste wat meer complexere 'applicaties' in PHP gaan steeds meer geheugen gebruiken tot ze crashen. Dat kan natuurlijk ook omdat er elke keer weer een paar cyclische referenties tussen nieuwe objecten ontstaan. Ik betwijfel echter of het nuttig is om reference counting allleen te implementeren: je hebt dan ZOWEL een traag systeem ALS een systeem wat niet voor 100% werkt (en ook niet voor 99%).
ik weet niet of je php weleens van binnen hebt gezien, maar echt, dat is dus driewerf bagger. Die lui hebben nog nooit gehoord van codeconventions, en ik heb echt het idee dat ze maar wat aanprutsen. Als je een php module wilt ontwikkelen dan belandt je in een wereld die samenhangt dmv allerlei ranzige macro's, waarbij je de ene keer wel een semicolon erachter moet zetten, en de andere keer weer niet. Het toppunt vind ik nog wel deze:
The prototype for parameter parsing function looks like this:
1
| int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...); |
(let op die missende komma na de eerste parameter). De aanroep van deze functie moet alsvolgt:
1
2
3
4
5
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsz", &l, &s, &s_len, ¶m) == FAILURE) { ... } |
(let weer op die missende komma)
Dan ga je eens kijken waar TSRMLS_CC gedeclareert is, kom je op deze define:
#define TSRMLS_CC , TRMLS_C
anyway, dit alles bij elkaar en je kunt je goed voorstellen dat ook al zou het moeten werken het toch eigenlijk niet werkt
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Dit:
1
2
| Test test = (Test)new java.lang.ref.WeakReference(new Test()).getObject(); System.gc(); |
Zou ervoor moeten zorgen dat new Test() gewoon wordt opgeruimd.
Overigens heeft Sun weer flink gesleuteld aan de garbage collector. Als je meer wil weten over garbage collection moet je hier eens kijken.
Tja, mijn C++ kennis is zeeeer beperkt. Ik blijf het lastig vinden dat als je een 'destructor' aanroept er toch nog systeem resources (geheugen) vastgehouden kunnen worden door een object dat je net om zeep hebt geholpen..oisyn schreef op 13 november 2002 @ 16:27:
Een destructor gooit een object niet weg, maar ruimt het simpelweg op (dan bedoel ik alles wat het object vasthoudt, maar niet zichzelf). Een destructor in C++ geeft het geheugen dan ook niet vrij (zou ook niet kunnen, aangezien een destructor niet weet of het object op de stack of op de heap is geallocceert)
Maar om even terug te komen op de manier waarop Java dit allemaal geregeld heeft: het enige dat van belang is, is dat je geen onnodige referenties bijhoudt. Als er aan GC gedaan wordt dan kun je er redelijk zeker van zijn dat er netjes opgeruimd wordt, exotische situaties als een object A en B die naar elkaar refereren waarbij er verder geen enkele referentie naar A of B meer is buiten beschouwing gelaten.
With the light in our eyes, it's hard to see.
Ik vrees van nietwebsjwans: Dit zou ervoor moeten zorgen dat new Test() gewoon wordt opgeruimd.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
in C++ roep je een destructor zelden zelf aan. Dit gaat meestal automatisch als het object buiten scope gaat, of als je gebruik maakt van de delete operator. De delete operator roept vervolgens de destructor aan, en geeft daarna het geheugen vrijBobco schreef op 14 November 2002 @ 09:28:
Tja, mijn C++ kennis is zeeeer beperkt. Ik blijf het lastig vinden dat als je een 'destructor' aanroept er toch nog systeem resources (geheugen) vastgehouden kunnen worden door een object dat je net om zeep hebt geholpen.
exotische situaties als een object A en B die naar elkaar refereren waarbij er verder geen enkele referentie naar A of B meer is buiten beschouwing gelaten.
zo exotisch vind ik dit niet, het komt regelmatig in mijn projecten voor (maar dan meer in de zin van een parent-child relatie, wederom in C++ overigens
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.