我有关于java字符串池的以下查询:
它是Java堆的一部分吗?它是JVM本机堆的一部分吗?根据我的理解它是第一个。
我们对此字符串池的大小有任何限制吗?或者是否可由用户配置?
在以下两个陈述中
String str = "Stack";
String str2 = str.concat("overflow");
根据我的理解,第一个字符串文字将成为字符串池的一部分,但之后我在相同的字符串池对象上进行连接,并且它将创建新的字符串对象,因此该对象将在字符串池中分配或它将在java堆外的字符串池中吗?
4。我假设字符串池大小是固定的,那么如果这个字符串池被完全占用会怎么样?gc会清理字符串池吗?或者JVM可以扩展字符串池的大小?
答案 0 :(得分:1)
在当前的Sun / Oracle实现中,interned字符串将与Java数据库一起永久生成。字符串没有单独的存储区。
此区域的最大大小可通过命令行选项(-XX:MaxPermGen
或其他)进行配置。
通常concat
将创建一个与其他任何对象分配的新String
对象。
如果PermGen填满,那么你会得到一个OutOfMemoryError
。 GC通常在PermGen上运行,但不太频繁。
所有这些都可能在实现和版本之间发生变化。