【问题标题】:Can we avoid interning of strings in java?我们可以避免在java中插入字符串吗?
【发布时间】:2011-04-15 05:24:33
【问题描述】:

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

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

有什么想法!!

【问题讨论】:

    标签: java performance permgen string-interning


    【解决方案1】:

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

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

    【讨论】:

    • 都是正确的,但是需要卸载/gc'ed 类才能使 gc 可以使用实习字符串。
    • 真奇怪,考虑到我一直看着它发生而没有任何东西被卸载。你的说法不正确。 stackoverflow.com/questions/1091045/… 该答案中的代码将向您表明,在现代 JVM 中,确实被拦截的字符串是 GC
    • 是的,如果你明确地实习字符串。是的我同意。我说的是 jvm 内部的标准常量。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 我正在寻找某种形式的 jvm 参数,它会禁用实习。如前所述,这仅用于实验目的。谢谢
    【解决方案3】:

    自 Oracle 的 Java 7 以来,实习生字符串池不再存储在 PerGen 中。在此处阅读更多信息http://java-performance.info/string-intern-in-java-6-7-8/

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 2021-11-17
        • 2021-06-23
        相关资源
        最近更新 更多