Repeatedly calling IdleNotification in this way is not guaranteed to force a garbage collection. If little has happened it will not. In order to experiment with this you could use SetFlagsFromSting and pass in --expose-gc. That will install a gc function in the global object so you can force a gc by executing the js code "gc()".
Hope this helps. -- Mads On Fri, Apr 8, 2011 at 9:20 PM, Charles Lowell <[email protected]> wrote: > Anton, > > I updated the snippet to try replicating your suggestion, but was > still unable to get the WeakReferenceCallback to be invoked. > > https://gist.github.com/908831 > > I would have expected the callback to have been invoked when GC is > forced the first time after making the object handle weak. Is the > Context is holding a strong reference to the object? > > cheers, > Charles > > > On Apr 8, 5:13 am, Anton Muhin <[email protected]> wrote: >> Charles, >> >> Contexts have complicated lifetime. If you just curious how weak >> handles work, you'd better play with simpler objects. >> >> Handle goes near death state when it found out it references weakly >> reachable object. You're callback is never invoked as v8 retains the >> context (it's a current context) and hence strongly reachable from >> inside v8. Value is base type, so everything is an instance of Value. >> >> Please note that you have a bug in your code: your weak callback must >> either dispose the handle passed or revive it. >> >> And, just in case, most of objects are created and returned back in >> Local handles. Those handles live as long as handle scope to which >> they belong and retain the object. Thus the code: >> >> HandleScope hs; >> Persistent p = Persistent::New(Object::New()); >> p.MakeWeak(...) >> // Force GC >> >> will never trigger weak callback as l is alive and it retains the >> object. The right way: >> >> Persistent p; >> { >> HandleScope hs; >> p = Persistent::New(Object::New());} >> >> p.MakeWeak(...) >> // Force GC >> >> hth and yours, >> anton. >> >> >> >> >> >> >> >> On Fri, Apr 8, 2011 at 1:59 AM, Charles Lowell <[email protected]> >> wrote: >> > Hi, >> >> > I'm having trouble understanding when a Persistent handle is >> > considered "Near Death", and when exactly a weak reference callback is >> > invoked. Consider the following code: >> >> >https://gist.github.com/908831 >> >> > It appears that the WeakReference Callback is never invoked. >> >> > I guess my questions are >> >> > 1) Why is it never considered near death? given that there is only one >> > reference to it which is weak. >> >> > 2) why isn't the PrintlnWeakReferenceCallback ever invoked? >> >> > 3) WeakReferenceCallbacks take a Persistent<Value> as a parameter. >> > What if, as in this case, the object is not a Value? >> >> > cheers, >> > Charles >> >> > -- >> > v8-users mailing list >> > [email protected] >> >http://groups.google.com/group/v8-users > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
