我对 java 字符串池有以下疑问:
它是 java 堆的一部分还是 JVM native 堆的一部分?根据我的理解,它是第一个。
我们对这个字符串池的大小有任何限制吗?还是用户可以配置?
在下面两条语句中
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/