From: Barre B. <ba...@ho...> - 2001-02-21 19:28:40
|
hmm.... I wonder if this is still true... that garbage collection is done by reference counting... This would be very wierd since there are circular references already in host objects! (Like subobjects of window that point back at window.) But.. this would explain IE:s general memory leak I guess. I wonder if delete solves this problem? At any rate, the destroy method would have to be recursive, like: function destroy(obj){ } > Sounds like we need a "null cycle killer". Damn sure circular references a > playing a big roll in our leak... > > > > > This problem with cycles is the price that must be paid for a simple, > lightweight, portable garbage collection scheme. The only way to prevent > this problem is by manual intervention. If you create code in which A refers > to B, B refers to C, and C refers to A, then you must be able to recognize > that you've created a cycle, and take steps to force the cycle to be garbage > collected when it is no longer needed. > > When you know that the objects in your cycle are no longer in use, you can > force them to be garbage collected by breaking the cycle. You can do this by > picking one of the objects in the cycle and setting the property of it that > refers to the next object to null. For example, suppose that A, B, and C are > objects that each have a next property, and the value of this property is > set so that these objects refer to each other and form a cycle. When these > objects are no longer in use, you can break the cycle by setting A.next to > null. This means that object B no longer has a reference from A, so its > reference count can drop to zero and it can be garbage collected. Once it > has been garbage collected, then it will no longer refer to C, so its > reference count can drop to zero and it can be garbage collected. Once C is > garbage collected, A can be garbage collected. > > Note, of course, that none of this can happen if A, B, and C are stored in > global variables in a window that is still open, because those variables A, > B, and C still refer to the objects. If these were local variables in a > function, and you broke their cycle before the function returned, then they > could be garbage collected. But if they are stored in global variables, they > will remain referenced until the window that contains them closes. In this > case, if you want to force them to be garbage collected you must break the > cycle and set the variables to null: > > > A.next = null; // break the cycle > A = B = C = null; // remove the last remaining external references > > > > > _______________________________________________ > Dynapi-Dev mailing list > Dyn...@li... > http://lists.sourceforge.net/lists/listinfo/dynapi-dev > |