Java字符串常量池也会被垃圾回收的相关说明
垃圾回收的概念
我们都知道Java中的垃圾回收,是指一些不使用的变量会被当作垃圾一样铲除, 使系统拥有更多的内存供其它程序使用,这就是垃圾回收的概念那么常量池中的字符串是否被垃圾回收呢?
笔者可以很肯定的告诉你,常量池中的字符串也会被垃圾回收例
当一个字符串"java265"已放入常量池中 此时如果系统中没有一个String对象引用常量池中的java265常量时 如果此时进行内存回收,则java265这个常量可能会被回收
字符串常量存储位置
在HotSpotJVM虚拟机中 方法区称为永久代 注意事项: 1.永久代在其它虚拟机(如BEA JRockit、IBM J9等)中是不存在 2.从JDK1.7开始,逐步使用元空间(MetaSpace)代替永久代 3.元空间内存大小取决于本地内存大小元空间代替永久代 4.字符串常量池存放在堆中
字符串对象引用放入字符串常量池
字符串常量池存放的是字符串对象的引用,例
//情况1 String str1 = "java265"; String str2 = "java265"; jvm先会查看字符串常量池中是否已经有对“java265”字符串对象的引用 当存在,直接返回池中的实例引用 当不存在,就会实例化一个字符串到堆中, 然后再在池中存一个对该字符串的引用 所以str1和str2指向的是同一个字符串对象。 //情况2 String str3 = new String("java265"); 无论字符串常量池中是否已经有java265字符串的引用, 都会在堆中创建一个字符串 str3指向堆中的字符串, 因此str3和str1 str2不是指向同一个对象。 //情况3 String str4 = str3.intern(); intern()方法: 当str3的字符串在池中有,就返回池中的引用, 否则在池中创建一个引用,再返回该引用, 所以str4 str1 str2为同一个字符串对象
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。