Actually finalization in reference counting GCs is much more predictable than in GCs that mark through the heap.
Contrary to want you might think --nouse-idle-notification does not disable automatic GC in V8. What it does is tells V8 not to perform GC actions (be it advance the sweeper, incremental marker or do a full GC) in response to IdleNotifications that embedder (node.js in this case) sends to V8. If V8 sees fit (e.g. on allocation failure) it _will_ perform it and you can't disable that. [also running through all objects is kinda how GC works, though it should be done in increments] -- Vyacheslav Egorov On Wed, Jul 11, 2012 at 5:02 PM, Michael Schwartz <myk...@gmail.com> wrote: > Here's a pattern, using Canvas as an example: > > function foo() { > var c = new Canvas(); > var ctx = c.getContext('2d'); > var grad = ctx.createLinearGradient(0,0, 10,10); > // do something / render > } > > There's now a native cairo_surface_t created (new Canvas). The c variable > has a this.surface referencing the native surface object. > There's now a native cairo_context_t created (c.getContext). The ctx > variable has a this.ctx referencing the native context object. > There's now a native cairo_pattern_t created (c.createLinearGradient). The > grad variable has a this.pattern referencing the native pattern object. > > All three need to be cleaned up at some point. > > There are no "destroy" (destructor) methods defined in the W3C spec for > Canvas, Context, Gradient, etc. Nobody is going to call them (they don't > client-side), unless writing non-portable SilkJS specific code. And > ideally, the code should be portable between client and server - that's one > of the best features of JavaScript running on both sides. > > I'm fully aware of the issues with finalize and reference counting based GC, > etc. Stephan made his rant about garbage collection and destructor issues > in that link I posted in my first message. Things haven't changed. He and > I have been and still are developing complex API for server-side, and this > is an issue we both face. Surely every API designer faces the same problem. > Assist from V8 in addressing the problem would benefit a wide audience. > > As for my choice to force GC: > > http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/ > > 2) V8′s idle garbage collection is disabled via “–nouse-idle-notification” > > This was critical, as the server pre-allocates over 2 million JS Objects for > the network topology. If you don’t disable idle garbage collection, you’ll > see a full second of delay every few seconds, which would be an intolerable > bottleneck to scalability and responsiveness. The delay appears to be caused > by the garbage collector traversing this list of objects, even though none > of them are actually candidates for garbage collection. > > In my case, I know when it is a good time to force a GC. It is being done > in process that is about to block in accept(). If it ties up a CPU core for > a bit, it is not going to stop the other processes from running, nor is the > GC going to pause the server in action. > > (The above is one of numerous WWW pages I've read about scaling NodeJS, > garbage collection pauses during benchmarks, etc.) > > > On Jul 11, 2012, at 7:38 AM, Andreas Rossberg wrote: > > On 11 July 2012 15:35, Michael Schwartz <myk...@gmail.com> wrote: >> >> GC finalization actually works for SilkJS. In the HTTP server, there are >> two nested loops. The outer loop waits for connections, the inner loop >> handles keep-alive requests. At the end of the inner loop (e.g. when the >> connection is about to be closed), I force a GC (or at least try to). > > > Hm, I don't quite follow. If you actually have a specific point where you > know that you want to dispose a resource, why is it impossible to dispose it > directly at that point? Or if there are many of them, you could maintain a > set/map of them. > > In any case, before you conclude that finalization is the answer to your > problems, let me +1 Sven's recommendation on reading Boehm's paper on the > subject. Finalization is pretty much an anti-pattern. There are some rare, > low-level use cases, but usually it creates more problems than it solves. > That's why we only provide it in the C++ API. > > Also, I should mention that forcing a GC manually is highly discouraged. > That causes a full (major, non-incremental) collection, which generally is a > very costly operation that can cause significant pause time, and basically > defeats most of the goodness built into a modern GC. > > /Andreas > > > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > > > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users