字符串文字和垃圾收集器在Java [重复](string literals and garbage

2019-10-20 05:05发布

这个问题已经在这里有一个答案:

  • 字符串字面的垃圾收集 4个回答

更具体地讲我读过,在Java 7中字符串字面现在存储在堆中如此的主要部分,做他们成为符合垃圾收集器?

String a ="z";
a = null;

现在确实对象“Z”获得垃圾回收,或仍处于串池作为一个匿名对象?

Answer 1:

字符串文字只能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编



Answer 2:

  • 等效字符串(甚至是那些存储在单独的包单独的类)将是指相同的字符串对象。

  • 一般来说,字符串没有资格进行垃圾回收。 永远

  • 在运行时创建的字符串将永远是那些从字符串文字创建不同的。

  • 您可以通过使用实习生()方法可以重复使用运行时字符串字符串文字。

  • 检查字符串平等的最好方法是使用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



文章来源: string literals and garbage collector in java [duplicate]