> On Oct 26, 2017, at 8:44 AM, Steve Fink <[email protected]> wrote:
> 
>> On 10/20/17 10:52 AM, Filip Pizlo wrote:
>> 
>> 
>>> On Oct 20, 2017, at 10:29 AM, Mark Miller <[email protected]> wrote:
>>> 
>>> There is a glaring inconsistency in the criteria we use to evaluate these 
>>> issues. While we are understandably reluctant to admit more non-determinism 
>>> into the platform via weakrefs, we have admitted an astonishingly greater 
>>> degree of non-determinism into the platform via "Shared Array Buffers" 
>>> (SAB), i.e., shared memory multithreading with data races.
>>> 
>>> The scenario we legitimately fear for weakrefs: A developer writes code 
>>> that is not correct according to the weakref specification but happens to 
>>> work on present implementations. Perhaps it relies on something being 
>>> collected that is not guaranteed to be collected.
>> 
>> Being collected when it shouldn’t have been?  Like a dangling reference.  
>> The game theory of security exploits forces implementations to keep things 
>> alive longer, not shorter.
>> 
>>> Perhaps it relies on something not being collected that is not guaranteed 
>>> not to be collected. A later correct change to an implementation, or 
>>> another correct implementation, causes that code to break. The game theory 
>>> punishes the correct implementation rather than the incorrect code.
>> 
>> Java had weak refs and multiple different implementations.  My claim, as 
>> someone who implemented lots of weird GC algorithms in Java, is that I don’t 
>> know of a case where different weak ref semantics breaks something.  The 
>> only time that getting it wrong ever had an observably bad effect is when 
>> you break weak refs or finalizers so badly that they never get cleared or 
>> called, and then some resource has an unbounded leak.  This usually results 
>> in not being able to run any benchmarks that have weak references or 
>> finalizers, so you fix those bugs pretty quickly.
>> 
>> Here are the motivations:
>> - Competitive perf motivates GC authors to try to free things as soon as 
>> possible.  Smaller heaps mean more speed.  Some benchmarks won’t run to 
>> completion if you aren’t aggressive enough.
> I don't follow this. My GC optimization work usually pushes in the opposite 
> direction -- scanning less, not more (but hopefully not *collecting* much 
> less). We [spidermonkey] partition the heap in all kinds of ways so we don't 
> have to collect the whole thing all the time. It's partitioned into 
> processes, the processes have thread-local heaps, and the thread-local heaps 
> are partitioned into independently-collectable zones specific to various 
> purposes (in the web browser, they're for tabs, iframes, and some internal 
> things.) It doesn't seem unlikely to have a weakref in a lightly-used zone 
> pointing into a more active zone. So yes, we'd aggressively collect the 
> pointee zone to keep the heap small, but scanning the pointer zones is a 
> waste of time. And we're always looking for more ways to subdivide the heap, 
> given that the overhead of GC is mostly determined by the amount of live 
> stuff you have to scan.
> 
> Generational GC similarly partitions the heap, for the same reason. If 
> nothing is surviving minor GCs, you won't bother doing any of the major GCs 
> that would collect the weakref pointees. I have considered (and I believe 
> other engines have implemented) having more generations, by splitting off 
> very long-lived (or alternatively, observed to be read-only) portions of the 
> tenured heap and not scanning those during most major GCs. (I haven't looked 
> enough to decide whether the extra cost and complexity of the write barriers 
> is worth it for us at this point.)
> 
I think you missed my point. I never said that GCs should scan more things. 
> That said, we *could* treat a weakref as a cue to collect the source and 
> destination zones together. Which would mean weakrefs would be something of a 
> "go slow" bit, but it might help contain the damage.
>> - The need to avoid dangling references forces us to keep alive at least 
>> what we need to, and sometimes a bit more.
>> 
>> I guess a program could rely on the weak references actually being strong in 
>> some implementation.  I haven’t heard of Java programs ever doing that.  
>> It’s unlikely to happen because the major implementations will try to clear 
>> weak refs as aggressively as they can to compete on benchmarks.
> GC-related competition on benchmarks gets really silly without anyone even 
> intentionally gaming things. I remember making a minor improvement and seeing 
> a benchmark score absolutely plummet. I tracked it down to the benchmark 
> having a "warmup" phase to each subtest (which is important for eliminating 
> variance that prevents detecting small changes, so it's not a wholly bad 
> thing). The minor change shifted several GCs from the unmeasured warmup phase 
> into the measured phase. At which point I realized that much of our parameter 
> tuning, in particular, had been having the effect of hiding GCs under the 
> covers, not necessarily speeding anything up. If a benchmark score started 
> depending on the promptness of weakref cleanup, then you're right, we'll 
> probably end up messing up our heap partitioning to satisfy whatever 
> arbitrary object graph it's testing, at a cost to real-world performance.
> 
Using benchmarks effectively is a skill. 
> We have multiple benchmarks and treat in-the-field telemetry as the gold 
> standard, so the worst of the effects get caught eventually. The length of 
> the feedback loop matters, though.
> 
> 
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to