我们能完全禁用字符串的内嵌吗?它可能没有真正的帮助,但只是一个想法。我认为至少有一点是有用的,即在jvm调优期间,控制perm gen的大小。
例如,如果我发布了一个OSGI框架,任何人都可以添加他们自己的任意数量的bundle,而每个bundle中的string interning都会完全扰乱我的调优参数。(当然,我知道我们应该在给定的固定发行版上进行调优,但仍然...)
任何想法!!
发布于 2011-04-15 13:28:15
Permgen大小/使用不是现代JVM的问题。当没有对它们的剩余引用时,垃圾收集器可以使用被占用的字符串。
(不,您不能“关闭”字符串字面量的嵌入)。
发布于 2011-04-15 15:04:00
您可以通过在代码中不使用任何字符串文字来禁用大多数字符串的内嵌。您可以改用char[],并从这些字符串中构建字符串。例如。
String hi = new String(new char[] { 'h', 'i' }); // not interned.
正如你所提到的,这只会给你自己创造工作,只会让事情变得更糟。
如果我给出了一个OSGI框架,并且任何人都可以添加他们自己的任何数量的bundle,并且每个bundle的字符串插入都会完全搞乱我的调优参数
如果他们添加捆绑包,他们可能需要更高的最大内存、perm gen大小、直接内存大小、不同的NewSize比率,甚至不同的GC。防止这种情况的唯一方法是阻止OSGi容器中的任何其他模块。
或者您可以这样说,如果您添加了包,您可能需要更改调优参数。
发布于 2013-12-14 03:57:06
从OracleJava7开始,实习生字符串池不再存储在PerGen中。点击此处了解更多信息http://java-performance.info/string-intern-in-java-6-7-8/
https://stackoverflow.com/questions/5672688
复制相似问题