9

如果字符串池上有很多字符串字面量并且内存不足会发生什么情况。它是否会扩大规模,如果是,如何?如果没有,如果我尝试创建更多的字符串文字会发生什么?

4

1 回答 1

15

首先第一点 - STRING POOL 没有字符串文字

字符串池是指向字符串对象的引用集合。

当您编写 String = "hello" 时,它会在堆上创建一个字符串对象 "hello",并将对该对象的引用放在字符串字面量池中(前提是堆上没有名为 "Hello" 的对象)

注意事项 "hello" 被 添加到对应类的常量池中。因此,只有在类卸载后才能对其进行垃圾回收。所以当类被卸载时,Objects 得到 GC

会发生什么?

字符串池是通过一个称为字符串规范化的过程完成的,该过程是一个弱哈希映射。当没有其他对键或值的引用时,这个弱哈希映射会自动清除映射。.ie 字符串将从 JVM 中被垃圾回收。

它会变大吗?

NO STRING POOL DOESNOT IN SIZE - 这是编译时间常数

它是如何变大的?

您需要在编译时指定-XX:StringTableSize=N,其中 N 是字符串池映射大小

最后你的问题:

如果字符串池内存不足会怎样?

最简单的答案:您java.lang.OutOfMemoryError:java.lang.OutOfMemoryError: Java heap space从 java 7 开始。在java.lang.OutOfMemoryError: PermGen space像 6 这样的旧版 java 中

于 2015-06-18T10:56:08.373 回答