另一个字符串的一个子将防止垃圾回收父字符串?(Will a substring of another

2019-08-20 02:54发布

String samplel = "ToBeGarbageCollected";
String sample2 = samplel.substring(0, 1);
samplel = null;

我知道内部的子字符串将保持原来的字符串的引用。

但是,通过显式定义samplelnull ,将样本1和SAMPLE2是可用于垃圾回收?

我记得在什么地方见过,如果父对象被明确设置为null的所有子值可用于垃圾收集。 这会不会保持好上述? 我如果这样的父子关系场景只是好奇? 如果不是,将这项事业sample1sample2是可用于垃圾回收?

String samplel = "ToBeGarbageCollected";
String sample2 = new String(samplel .substring(0, 1));
samplel  = null;

Answer 1:

首先要说的是,垃圾收集不会立即发生。 因此,分配null到什么都不/不会造成垃圾收集。 什么是可以做的,是导致对象变得不可 ...这将使其在未来的GC运行垃圾收集的潜在候选。


现在,您的具体实例。

重要提示:以下内容适用于较大的JVM; 即Java 7的更新5和更早版本。 在Java 7更新6,他们改变String.substring()以使目标串和子串得到不共享支持数组。 这消除了潜在存储泄漏问题substring


substring方法不把参照原字符串的新的String。 其实际作用是保存到原始字符串的支持数组的引用; 即保持所述字符阵列。

不过话说回来,分配nullsamplel是不足以使整个原始字符串的状态无法访问。 原始字符串的整个背阵列将保持可...,这意味着它不会被用于垃圾收集的候选者。

但还有另一种并发症。 您可以设置sample1为字符串文字,并表示一个字符串文字字符串对象总是到达(除非整个班级被卸载!)

但是,通过显式定义样品1为空,将样本1和SAMPLE2是可用于垃圾回收?

原来sample1对象将保持完全可达, sample2仍将是可达的,除非该变量超出范围。

如果sample1一直没文字并有以任何其它引用,那么答案将是不同的。 所述sample1对象将是不可访问的,但其背衬阵列仍然会经由可达sample2


在第二个例子中,复制子导致创建一个新的String。 它保证了新的字符串不会分享与原来的字符串和临时串的支持数组。 在这种情况下,分配null是不必要的。

现在都SAMPLE1和SAMPLE2是可用于垃圾回收?

答案是一样的上述对于其中的情况下sample1是文字。

如果sample1是不是文字,也没有其他的引用,然后sample1和临时子现在是无法访问。


我只是想知道哪里String构造是有帮助的。

理论上这将是。

实际上它取决于引用是否仍可达当GC最终得到周围寻找......并且还取决于是否弦乐问题足够大,足以众多会对内存使用量的显著影响。

而在实践中, 通常前提条件没有满足,创造一个新的字符串一样, 通常不会帮助。



Answer 2:

请记住,在Java中String是不可改变的。 在这种情况下, sample1将被丢弃,但sample2从不指着sample1 :它指出,在JVM中单独举行不变的字符串,在最新的时创建substring被调用。

当您设置sample1为null,它指向的内存成为可进行垃圾回收(假设持有相同的值没有其他串并指出在该位置没有其他变量)。 当您使用new关键字(或隐原始的分配这样做)新内存在堆上分配(一般;再次,字符串是不变的,共享相同的内存)。 如果没有指针(读:任何命名变量)指向的内存给定的位置,这是可进行垃圾回收。

记住:在那里有一个对象的引用任何情况下,就进行垃圾回收。 对象不被分配给他们的变量名定义的,而是在存储器位置,而变量名用作指针(参考文献)对这些对象。 字符串是有点不同,因为它们是不可变的,而JVM可以选择不垃圾收集原因独立对它们的引用的。



文章来源: Will a substring of another string prevent the parent string from being garbage collected?