java - 关于 Java String Pool 的一些疑问

标签 java string

我对 java 字符串池有以下疑问:

  1. 它是 java 堆的一部分还是 JVM native 堆的一部分?根据我的理解,它是第一个。

  2. 我们对这个字符串池的大小有任何限制吗?还是用户可以配置?

  3. 在下面两条语句中

    String str = "Stack";
    String str2 = str.concat("overflow");
    

根据我的理解,第一个字符串文字将成为字符串池的一部分,但之后我对同一个字符串池对象进行了连接,它将创建新的字符串对象,因此该对象将在字符串池中分配还是它会在字符串池之外的java堆中吗?

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

最佳答案

在当前的 Sun/Oracle 实现中,驻留字符串将与类数据一起在 Java 堆的永久生成中。字符串没有单独的内存区域。

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

一般来说,concat 会创建一个新的 String 对象,分配方式和其他对象一样。

如果 PermGen 已满,则会出现 OutOfMemoryError。 GC 通常在 PermGen 上运行,但频率较低。

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

关于java - 关于 Java String Pool 的一些疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3653255/

相关文章:

python - 如何从 URL 中删除片段标识符?

string - 在 Swift 中索引字符串

java - Spring Boot 配置处理器,前缀的重复@ConfigurationProperties 定义

Java - 确定磁盘格式(RAW 或 FS)

java - 如何获取二维数组(矩阵)的子数组

java - Google App Engine - Java Servlet - 文件访问

java - 填充 Hashmap 时超出 GC 开销限制

python - 如何在 Python 中将一个字符串 append 到另一个字符串?

c++ - 如何按多种括号类型拆分字符串但仍将括号保留在 C++ 中?

python - 在 Python 中处理字符串中的转义序列