关于Java String Pool的一些查询

时间:2010-09-06 17:28:52

标签: java string

我有关于java字符串池的以下查询:

  1. 它是Java堆的一部分吗?它是JVM本机堆的一部分吗?根据我的理解它是第一个。

  2. 我们对此字符串池的大小有任何限制吗?或者是否可由用户配置?

  3. 在以下两个陈述中

    String str = "Stack";
    String str2 = str.concat("overflow");
    
  4. 根据我的理解,第一个字符串文字将成为字符串池的一部分,但之后我在相同的字符串池对象上进行连接,并且它将创建新的字符串对象,因此该对象将在字符串池中分配或它将在java堆外的字符串池中吗?

    4。我假设字符串池大小是固定的,那么如果这个字符串池被完全占用会怎么样?gc会清理字符串池吗?或者JVM可以扩展字符串池的大小?

1 个答案:

答案 0 :(得分:1)

在当前的Sun / Oracle实现中,interned字符串将与Java数据库一起永久生成。字符串没有单独的存储区。

此区域的最大大小可通过命令行选项(-XX:MaxPermGen或其他)进行配置。

通常concat将创建一个与其他任何对象分配的新String对象。

如果PermGen填满,那么你会得到一个OutOfMemoryError。 GC通常在PermGen上运行,但不太频繁。

所有这些都可能在实现和版本之间发生变化。