Can we completely disable interning of strings. It might not be really helpful, but just a thought. I can think atleast one point where it could be helpful i.e. during jvm tuning, controlling the size of the perm gen.
For e.g. if I give out an OSGI framework and anyone can add any number of bundles of their own and each bundles string interning can completely screw up my tuning parameters. (Ofcourse I know that we should do tuning on a given fixed distro, but still...)
Any thoughts!!
Permgen size/usage isn't an issue with modern JVMs. Interned strings are made available to the garbage collector when there are no remaining references to them.
(And no, you can't "turn off" interning of string literals).
You can disable the interning of most string, by not using any String literals in your code. You could use char[] instead and build Strings from those. E.g.
String hi = new String(new char[] { 'h', 'i' }); // not interned.
As you mentioned, this just creates work for yourself and will just make things worse.
if I give out an OSGI framework and anyone can add any number of bundles of their own and each bundles string interning can completely screw up my tuning parameters
If they add bundles, they could need a higher, maximum memory, perm gen size, direct memory size, different NewSize ratio, even a different GC. The only way to prevent this, is to prevent any other modules in your OSGi container.
Or you can just say, if you add bundles you may need to change the tuning paramters.
Since Oracle's Java 7 the intern string pool isn't stored in PerGen anymore. Read more here http://java-performance.info/string-intern-in-java-6-7-8/
String is a final class, and cannot be extended. Therefore, no - you cannot remove the ability to intern Strings in Java.
来源:https://stackoverflow.com/questions/5672688/can-we-avoid-interning-of-strings-in-java