Oracle Tunes Java's Internal String Representation
infoq.com
infoq.com
http://www.reddit.com/r/programming/comments/1qw73v/til_orac...
I was quite surprised that we _always_ copy the array. I would have guessed that .substring(1) (all but the first character) is very common, and that it would be a win to share the array in some circumstances. A straw-man heuristic would be "share the array if we're using at least half of it".
But they didn't do that. Anyone know if there's a public discussion?
Java's strings are immutable, so copy-on-write is nonsense.
Performance tuning for mutable string types has been moving away from the copy-on-write paradigm (it used to be common in C++, but not any more). It's a big mess because the design of the C++ string class was truly botched, it's much less of a mess in other languages where you have different types for mutable and immutable strings (Java, C#, Python, etc.)
And I have a question: why could it not be done like this:
Java currently has weak references, soft references, and phantom references. If there was an additional type of weak-like reference, that had a callback with an object before it was garbage collected, this conundrum would be simple. Have any substrings have a weak-like reference to the character array. If the parent string is garbage-collected, then do the copying like the new behavior, but until then don't: use the old behavior.
You've basically described weak references to objects with finalizers. Unfortunately, I'd wager this is even more expensive, not less.
He's right that a new VM-level hook would be required to implement his idea. The benefits don't clearly justify making a change of that magnitude.
In C#, WeakReference can take a boolean parameter during construction to specify if it tracks post-finalize or not (defaulting to the same behavior as Java which google tells me is as you say: not), and you can re-register your finalizer, but even so this kind of thing isn't what the GC is primarily designed for and it will probably show. I'm not sure if you can re-register finalizers in Java.
And Java probably has the best GC algos out there.
This would be a surprising bit of behaviour, which means it's probably a bad idea. However, it wouldn't break any current code, because it preserves current behaviour, and hopefully wouldn't break future code, because people could learn about the quirk. Also, i think subSequence tends to be used to create temporary objects as computational intermediaries, rather than new long-lived objects which escape to the heap, so it shouldn't lead to excessive packratting in the way the old-style substring did.
http://www.reddit.com/r/programming/comments/1qw73v/til_orac...
A bit of profiling and then code-digging helped find this oddity. That was probably an optimization where the side effects were not carefully considered. Even the Javadoc is vague (http://docs.oracle.com/javase/6/docs/api/java/lang/String.ht...):
Returns a new string that is a substring of this string. The substring begins with the character at the specified index and extends to the end of this string.
Now I see the benefit of the optimization so I am almost against removing it (we coded our own substring at the time). How about Oracle provide a static method to return a substring in 0(1) ?
I believe most Java devs don't even know about the current substring implementation and most programs are not adversely impacted by it either.
Not possible anymore, since they used the occasion to eliminate the offset and length fields.
See discussions here: http://stackoverflow.com/questions/8833385/is-support-for-co...