2

我们可以完全禁用字符串的驻留吗?它可能没有真正的帮助,但只是一个想法。我可以认为至少有一点可能会有所帮助,即在 jvm 调整期间,控制 perm gen 的大小。

例如,如果我给出了一个 OSGI 框架,并且任何人都可以添加自己的任意数量的捆绑包,并且每个捆绑包字符串实习可以完全搞砸我的调整参数。(当然我知道我们应该对给定的固定发行版进行调整,但仍然......)

有什么想法吗!!

4

4 回答 4

6

Permgen 大小/使用不是现代 JVM 的问题。当没有对它们的剩余引用时,垃圾收集器可以使用内部字符串。

(不,你不能“关闭”字符串文字的实习)。

于 2011-04-15T05:28:14.550 回答
1

您可以通过在代码中不使用任何字符串文字来禁用大多数字符串的实习。您可以改用 char[] 并从中构建字符串。例如

String hi = new String(new char[] { 'h', 'i' }); // not interned.

正如你所提到的,这只会为你自己创造工作,只会让事情变得更糟。

如果我给出一个 OSGI 框架并且任何人都可以添加自己的任意数量的捆绑包,并且每个捆绑包字符串实习可以完全搞砸我的调整参数

如果他们添加捆绑包,他们可能需要更高的最大内存、perm gen 大小、直接内存大小、不同的 NewSize 比率,甚至不同的 GC。防止这种情况的唯一方法是阻止 OSGi 容器中的任何其他模块。

或者您可以说,如果您添加捆绑包,您可能需要更改调整参数。

于 2011-04-15T07:03:59.883 回答
1

由于 Oracle 的 Java 7,实习生字符串池不再存储在 PerGen 中。在这里阅读更多http://java-performance.info/string-intern-in-java-6-7-8/

于 2013-12-13T19:57:06.147 回答
0

String是 final 类,不能扩展。因此,不 - 您不能删除在 Java 中实习字符串的能力。

于 2011-04-15T05:27:52.160 回答