I am currently rethinking the object dispose handling of the qooxdoo JavaScript framework.
Have a look at the following diagram (A is currently in scope):
diagram http://yuml.me/51747906.jpg
Let's say we want to delete B. Generally, we cut all reference between all objects. This means we cut connection 1 to 5 in the example. Is this really necessary?
As far as I have read here, browsers use the mark-and-sweep algorithm. In that case, we just need to cut reference 1 (connection to the scope) and 5 (connection to the DOM) which could be much faster.
But can I be sure that all browsers use the mark-and-sweep algorithm or something similar?
The mark-and-sweep algorithm is called a tracing garbage collector because it traces out the entire collection of objects that are directly or indirectly accessible by the program.
Some high-level languages, such as JavaScript, utilize a form of automatic memory management known as garbage collection (GC). The purpose of a garbage collector is to monitor memory allocation and determine when a block of allocated memory is no longer needed and reclaim it.
Stop the World Event - All minor garbage collections are "Stop the World" events. This means that all application threads are stopped until the operation completes. Minor garbage collections are always Stop the World events.
For any decent garbage collector (not only mark-and-sweep), cutting connection 1 would be enough to release B (and C and D and the window). Allocation based on reference counting would fail to release B and D due to their cyclic references (B references D and D references B) but reference counting is not really garbage collection.
I think it is safe to assume that all browsers use a decent garbage collector (well, with browsers, nothing is ever really safe, but a JavaScript implementation not using a proper garbage collector is improbable nonetheless).
The thing is that in an ideal world, you basically just need to disconnect DOM nodes and native event listeners. Problem is though, that the original system in qooxdoo was designed around buggy browsers like IE6. We saw massively reduced memory usage when we delete as much as possible on our own. In todays world I would however redesign it in a way that it's OK in IE6, but not optimized for its problems.
There is also a difference of a complete shutdown of the whole application (dispose all) and just to dispose a single fraction of an application. In the last scenario you need to act quite carefully to not dispose stuff which is still needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With