Can we avoid interning of strings in java?

2019-01-27 03:35发布

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!!

4条回答
Lonely孤独者°
2楼-- · 2019-01-27 03:57

String is a final class, and cannot be extended. Therefore, no - you cannot remove the ability to intern Strings in Java.

查看更多
女痞
3楼-- · 2019-01-27 04:05

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/

查看更多
我命由我不由天
4楼-- · 2019-01-27 04:06

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.

查看更多
地球回转人心会变
5楼-- · 2019-01-27 04:14

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).

查看更多
登录 后发表回答