【问题标题】:Memory allocation for local String literals?本地字符串文字的内存分配?
【发布时间】:2013-03-24 08:59:52
【问题描述】:

我知道当我们创建字符串字面量时,它会进入 permgenspace。我的问题是它是否会在 jvm 的生命周期内一直存在,即使该字符串文字是方法的本地变量。例如我有以下代码 sn-p:-

private static void testString1(){
        String str1="tetingLiteral";
    }


private static void testString2(){
        String str2="tetingLiteral";
    }

现在从我调用的主要方法

testString1();
testString12();

str1 和 str2 将引用相同的内存位置。

我的理解是它们将引用相同的内存位置(即使在方法内部创建了字符串文字,它也会在 jvm 的生命周期内保留在那里)。但仍然想确认它,因为我无法以编程方式检查它,因为无法打印字符串内存位置

【问题讨论】:

  • 有两种方法可以获取有关字符串内存位置的信息。 (1) == 如果两个 String 引用都为 null 或都引用同一个 String 对象,则它们的比较为真。 (2)System.identityHashCode尽可能为每个不同的对象返回不同的值。

标签: java string memory garbage-collection


【解决方案1】:

来自section 3.10.5 of the Java Language Specification

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

(请看下面的例子,它显示了字符串实习也适用于不同包中的类。)

【讨论】:

    【解决方案2】:

    确切的实现是 JVM 特定的,但在 Oracle Java 7 中,字符串文字位于堆上,并且可以在没有类使用字符串文字时被清理(因为它们已被卸载)

    【讨论】:

    • 是否意味着它们会随着正常的 GC 运行而被清理?
    • 我怀疑它们只会在 Full GC 上被清理。在 Java 8 中,permgen 将被删除,类也将在堆上。
    • 彼得还有一件事,知道为什么 java 7 在堆上存储字符串文字会很有帮助(因为字符串文字是永久错误的最大贡献者之一)?还有为什么在 Java 8 中 permgen 会被移除,而类也会在堆上?
    • 很抱歉问的太多了。但是因为你提供了全新的信息,所以我忍不住问了这个
    • AFAIK,感觉调整两个空格对很多人来说太复杂了。使用单个堆简化了设计和调整。在 JEE 系统中,permgen 很容易被填满。恕我直言,如果简单的库是一件好事,那么使用最低限度是一件好事,它的好处是永远不会填满你的 perm gen。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多