This PR uses the Parser & StaticOptimizer thread local string interner for keys in static objects
Similarly, we deduplicate the String -> Boolean map used to determine if a field is static.
For static objects we also use immutable.VectorMap (with a JavaWrapper) for the field set.
Lastly for the value cache, we size it according to the number of keys in the object this reduces unnecessary up-sizing for large objects, and more importantly removes the large number of sparse maps we previously had for small objects (the default was 16 elements)
Sorry I missed your most important question. The performance impact here was undetectable in the benchmark. I think the fact that the object interning is thread-local and unsynchronized makes it pretty fast.
Before: 855MB for the parsed file
After: 425MB