不,通常您不能手动“从Java中的字符串池中破坏引用”。
我想为什么要定位它的主要原因是为了避免内存不足错误。在Java中,有6天时间,所有被嵌入的字符串都存储在PermGen中,PermGen是堆的固定大小部分,主要用于存储加载的类和字符串池。除了显式的固定字符串外,PermGen字符串池还包含程序中先前使用的所有文字字符串。Java
6中字符串池的最大问题是它的位置– PermGen。 PermGen 具有固定大小,无法在运行时扩展。您可以使用 -XX:MaxPermSize
= N 选项进行设置。这将导致内存泄漏和内存不足错误。
在Java 7中-字符串池已重定位到 堆 。这意味着您不再受限于单独的固定大小的存储区。现在,所有字符串和大多数其他普通对象一样都位于堆中。
您还可以通过配置 -XX:StringTableSize = N来 增加字符串池的大小。如果不确定字符串池的使用情况,请尝试 -XX:+
PrintStringTableStatistics JVM参数。程序终止时,它将打印您的字符串池使用情况。
在JDK中,还有一个 名为jmap的工具 ,可用于在您的应用程序中查找许多内联字符串。
jmap -heap process_id
例如:
jmap -heap 18974
与其他输出一起,此命令还输出内联字符串的数量及其所占的空间“ xxxxxx内联字符串占xxxxxx字节” 。
字符串池中对象的垃圾回收规则与其他 字符串或任何其他对象的 规则相同
。但是事实上,与String文字相对应的String对象通常总是可以访问的,因为在使用该文字的每种方法的代码中都有对字符串对象的隐式引用,因此通常它们不是垃圾回收的候选对象。然而,这并非总是如此。如果文字是在动态加载的类中定义的(例如,使用Class.forName(…)),则可以安排该类的卸载。如果发生这种情况,则文字的String对象将无法访问,并且在包含内部String的堆被GC回收时将被回收。



