That example looks to me like it could be implemented with WeakMap instead of WeakRef. Am I missing something?
On Thu Nov 07 2013 at 2:43:45 PM, K. Gadd <k...@luminance.org> wrote: > I'll try and restate an example I used before. > > Let's say you're building a somewhat simple tab-based application, where > each tab represents a different 'mode'. In this case, you need a higher > level coordinating object that manages the tab bar, and it needs to own > references to all of the active modes in order to manage the tabs. > Similarly, each mode may need to have a reference to the coordinator in > order to interact with it - like by setting the title of the tab, or > opening a new tab containing another mode - and it may need to have > references to other modes in order to communicate (like if one tab opens a > tab containing related information). > > In a model like that, you can trivially end up with object cycles. All the > references (going in every direction) are strong, so to successfully > collect a mode you need to ensure that every reference to it from live > objects is released. This is problematic because it means that, for example: > > If Mode A opens a new tab containing Mode B, and Mode A wants to respond > to things happening in Mode B, Mode A now has to register some sort of > event listener on Mode B. This means that Mode A and Mode B have now formed > a strong cycle: Mode B's event listener list contains a strong reference to > Mode A (to fire the event notification), and Mode A has a strong reference > to Mode B in order to be able to respond to those events. > > Now, if you close Mode B, the coordinator gets rid of the tab and drops > its strong references to Mode B - the tab is 'gone' - but there's no > trivial way to ensure that everyone else holding a reference to it is dead. > If multiple tabs interact in this way it's possible for a huge graph of > objects to be hanging off one live tab. Eventually, if you close enough > tabs you might 'free' the graph, but if you aren't careful the coordinator > itself can end up keeping dead tabs alive, with things like event listener > lists. > > In the real apps I've worked on like this, the solution was some form of > weak references - making event listeners own weak self-references instead > of strong self-references, so that in normal circumstances event > subscriptions expire along with the subscriber, along with using weak > references directly in cases like 'tab a spawns tab b' in order to ensure > that you aren't keeping an object alive just to monitor it. > > IIRC, cycles like this are already common in some DOM scenarios, where > event subscription and such result in big graphs of objects hanging off a > single live object? I've certainly run into it in a few cases, where an > event listener hanging off an <audio> element caused a huge graph of > objects to leak, and I had to manually remove the event listeners at an > appropriate time (and finding an appropriate time can be difficult!) > > > On Thu, Nov 7, 2013 at 2:33 PM, Mark S. Miller <erig...@google.com> wrote: > > Could you give an example, hopefully simple, of such a problem you can > solve better with GC + weakmaps + weakrefs but without finalization, vs > just GC + weakmaps ? Thanks. > > > On Thu, Nov 7, 2013 at 1:46 PM, K. Gadd <k...@luminance.org> wrote: > > When I talk about the importance of weak references I am *not* talking > about the importance of finalization for managing native/remote resources; > that's an important consideration but it's a separate one. When I talk > about why weak references are important, I mean for the purposes of > building large applications without creating uncollectable cycles in object > graphs. Doing this without weak references is *very* difficult in some > scenarios, and in other scenarios requires manual management of all object > lifetimes (addref/release style, or having a single lifetime owner that > 'deletes' an object on demand). > > That's the sort of obstacle that factors into a developer's choice of > language and toolset. I've seen this particular concern with ES crop up in > the past on real projects, and I've seen firsthand how difficult it is to > avoid uncollectable cycles in a language environment without any sort of > weak reference mechanism. Leaking large uncollectable cycles can have > catastrophic consequences in multimedia applications and games, where those > cycles might be retaining images or sounds or other huge game assets. > > > On Thu, Nov 7, 2013 at 9:19 AM, Terrence Cole <tc...@mozilla.com> wrote: > > On 11/06/2013 07:37 PM, K. Gadd wrote: > > Generally speaking, all the discussions on this list about WRs so far > have > > not suggested that there is any way to introduce WeakRefs without making > GC > > behavior observable in some fashion. WeakRefs functionally make GC > > observable because when you try to get at the target of the weakref, you > > either get it or you don't. Once you introduce the ability to get back > > 'null' when asking for the target of a WR (or any similar failure case), > > you can use that to determine things about GC behavior. > > > > If you somehow eliminate this weakness, WRs no longer solve the problems > > they are intended to solve. Or at the least, they solve only a small > > reduced subset of the problems solved in real software via the use of > weak > > references. Being able to access the target of the WR (and have this > > operation fail) is core to their value (even if finalization > notifications > > are also used quite often). > > > > I've already argued in the past about why weak references are important, > > and why not having solutions for those problems will kneecap the > > development of web applications by either preventing certain types of > > software from running in the browser, or forcing implementers to write > > their own GCs (or entire runtime environments) inside the browser, as is > > done with environments like emscripten and native client. Once that > becomes > > the solution, the ES spec is irrelevant for those applications because > they > > have had to abandon the language. While the risk of something like this > > happening is still relatively low, the risk increases over time as more > > people begin seriously considering solutions like emscripten and nacl - > > we're starting to see companies ship real products using them already. If > > this spreads to popular reusable libraries (physics libraries, rendering > > libraries, etc), there's a risk that those libraries will pull new > > applications out of the ES realm because it's not possible to use those > > libraries without abandoning ES in favor of a custom GC/runtime > environment. > > > > Based on the conversations thus far, a choice just has to be made between > > the two downsides: exposing some amount of GC internals, or making it > > impossible to write some subset of applications in ES. It's possible that > > exposing GC semantics has such catastrophic security consequences that > > ruling those applications out is merited. It's also possible that > > workarounds can be applied to reduce the harm of GC visibility (I think > in > > the past someone - maybe Mark? - suggested that disabling cross-realm WRs > > would mitigate the damage considerably?) > > This is a false dichotomy. At the extreme, we could simply ship a new > builtin resource manager which has it's own GC behaviour that we can > expose at will. Given that the sorts of resources that people want to > use the memory GC to manage generally have very different cost and > volume tradeoffs than memory [1], this is actually much more reasonable > than it sounds. > > The real problem with weak things is that they do have a performance > impact on the GC, even when not used. Missing weak-maps can at least be > worked around; a slow environment cannot. > > -Terrence > > 1 - > > http://www.mail-archive.com/dev-tech-js-engine-internals@lists.mozilla.org/msg00572.html > > > On Wed, Nov 6, 2013 at 3:23 PM, Oliver Hunt <oli...@apple.com> wrote: > > > >> On Nov 6, 2013, at 3:14 PM, Rick Waldron <waldron.r...@gmail.com> > wrote: > >> > >> > >> > >> > >> On Wed, Nov 6, 2013 at 2:15 PM, Domenic Denicola < > >> dome...@domenicdenicola.com> wrote: > >> > >>> Thanks Mark for the education, especially on the pre- vs. post-morterm > >>> finalization distinction. I don't think I was specifically advocating > for > >>> pre-mortem in my OP, since I didn't really understand the difference > :P. > >>> Post-mortem finalization sounds quite reasonable. What do people think > of > >>> introducing it into ECMAScript? > >>> > >> > >> This may be a naïve question, but how would the handler know which > >> object/weakref had been gc'ed? > >> > >> You wouldn’t :) > >> > >> I’m kind of anti-finalisers in JS for all of the reasons people have > >> raised - they are extremely hazardous, expose non-deterministic > behaviour, > >> etc > >> > >> Given our general desire to avoid exposing internal GC semantics, and > the > >> difficulty in defining observable GC behaviour (I suspect this would be > a > >> non-starter in any case), I can’t see any specification that would allow > >> useful finalisers or WeakRefs. > >> > >> If MarkM has an idea for WeakRefs that don’t leak observable GC > behaviour > >> i’d love to hear, but in general i’m opposed to both them and > finalisers :-/ > >> > >> —Oliver > >> > >> Rick > >> > >> _______________________________________________ > >> es-discuss mailing list > >> es-discuss@mozilla.org > >> https://mail.mozilla.org/listinfo/es-discuss > >> > >> > >> > >> _______________________________________________ > >> es-discuss mailing list > >> es-discuss@mozilla.org > >> https://mail.mozilla.org/listinfo/es-discuss > >> > >> > > > > > > > > _______________________________________________ > > es-discuss mailing list > > es-discuss@mozilla.org > > https://mail.mozilla.org/listinfo/es-discuss > > > > > > > > -- > Cheers, > --MarkM > > >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss