这个问题已经在这里有一个答案:
- 字符串字面的垃圾收集 4个回答
更具体地讲我读过,在Java 7中字符串字面现在存储在堆中如此的主要部分,做他们成为符合垃圾收集器?
String a ="z";
a = null;
现在确实对象“Z”获得垃圾回收,或仍处于串池作为一个匿名对象?
这个问题已经在这里有一个答案:
更具体地讲我读过,在Java 7中字符串字面现在存储在堆中如此的主要部分,做他们成为符合垃圾收集器?
String a ="z";
a = null;
现在确实对象“Z”获得垃圾回收,或仍处于串池作为一个匿名对象?
字符串文字只能GCed当contaning这些文字所有的类都是GCed这反过来,如果里面装这些类的类加载器是GCed只能发生。
例:
public interface I {
String getString();
}
public class Test2 implements I {
String s = "X";
@Override
public String getString() {
return s;
}
}
public class Test implements I {
String s = "X";
@Override
public String getString() {
return s;
}
}
public class Test1 {
public static void main(String[] args) throws Exception {
ClassLoader cl = new URLClassLoader(new URL[] {new URL("file:d:/test/")});
I i = (I)cl.loadClass("Test").newInstance();
WeakReference w = new WeakReference(i.getString()); //weak ref to "X" literal
i = null;
cl = null;
System.out.println(w.get());
System.gc();
Thread.sleep(1000);
System.out.println(w.get());
}
}
编译这些类,移动的Test.class到d:/测试,使系统类加载器无法看到它,然后运行为主。 你会看见
X
null
这意味着“X”是GC编
等效字符串(甚至是那些存储在单独的包单独的类)将是指相同的字符串对象。
一般来说,字符串没有资格进行垃圾回收。 永远 。
在运行时创建的字符串将永远是那些从字符串文字创建不同的。
您可以通过使用实习生()方法可以重复使用运行时字符串字符串文字。
检查字符串平等的最好方法是使用equals()方法。
资源 :
http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
请注意,这是一个有点先进的 - 你必须知道一些关于String类的内部运作明白这一点。
甲字符串对象存储其数据中的字符阵列。 当你把一个字符串的一个子,通过调用子()方法,那么创建的新String对象不会复制原始字符串的数据的一部分。 取而代之的是,它存储到原来的字符串的基础数据的基准,与偏移量和长度来指示老串新String对象表示的哪个部分沿。
当你有一个很长的字符串(例如你读取文件的内容到一个String对象),你采取了串出来,那么JVM将保留在内存中的原始字符串的所有数据 - 即使你抛弃原来的字符串对象,因为()与子创建的字符串对象仍持有与所有的数据的引用整个字符数组。
为了防止这种记忆效率低下,你可以明确地创建一个使用子对象的新String对象。 这第二个新的String对象将从子对象中的数据复制,只是你需要的部分。 鉴于plainprint? 注:在代码块文本内容自动为自动换行
// Suppose this contains 100K characters read from a file
String largeString = ...;
// This will refer to the 100K char array from largeString, keeping the whole buffer in memory
// even though sub represents only 20 characters
String sub = largeString.substring(80, 100);
// This will copy the 20 characters from sub into a new buffer, so that the whole 100K buffer doesn't need to be kept
String sub2 = new String(sub);
如果你想看看它究竟是如何工作的,然后看看String类,你可以在你的JDK安装目录中的文件src.zip找到的源代码。
资源 :
http://www.coderanch.com/t/542489/java/java/string-literal-String-Object