On Jul 27, 2009, at 12:06 PM, Zoltan Herczeg wrote:

Hi,

by default, gc::collect() is triggered by a timer at regular intervals. In QtLauncher, gc::collect() is not called in any other way, so the remaining
JS objects cause memory leaks when QtLauncher exits. Although this
approach may not be considered a bug, since the program soon quits, I
would be curious what other ports do before they return to the OS? This question is more important, if we want to use WebKit as a library: in this case the closing of the last WebKit frame may not necessary means the end
of the current program.

Heap::collect() is called:

- By JavaScriptCore internal to GC allocation after some number of allocations (which varies with the side of the heap). - By WebCore on a one-shot zero-delay timer after after a frame is navigated (clearing the global object) or after an item expires from the back/forward cache - In debug builds by WebKit (at least the mac version) immediately when a WebView is closed during the app termination process.

Thus, after the last frame is closed there will be a garbage collection unless the process exits before the timer has a chance to run, and on Mac debug builds we make an extra effort to clean up for the benefit of leak checking. (On release builds, we want to enable the app to exit as fast as possible so we avoid all cleanup except for flushing pending writes to disk.)

It's possible for GC to fail to completely clean up, because it is partially conservative. The zero-delay timer is there to reduce the risk of false stack references.

Regards,
Maciej

_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to