String samplel = "ToBeGarbageCollected";
String sample2 = samplel.substring(0, 1);
samplel = null;
我知道内部的子字符串将保持原来的字符串的引用。
但是,通过显式定义samplel
为null
,将样本1和SAMPLE2是可用于垃圾回收?
我记得在什么地方见过,如果父对象被明确设置为null
的所有子值可用于垃圾收集。 这会不会保持好上述? 我如果这样的父子关系场景只是好奇? 如果不是,将这项事业sample1
或sample2
是可用于垃圾回收?
String samplel = "ToBeGarbageCollected";
String sample2 = new String(samplel .substring(0, 1));
samplel = null;
首先要说的是,垃圾收集不会立即发生。 因此,分配null
到什么都不/不会造成垃圾收集。 什么是可以做的,是导致对象变得不可 ...这将使其在未来的GC运行垃圾收集的潜在候选。
现在,您的具体实例。
重要提示:以下内容仅适用于较大的JVM; 即Java 7的更新5和更早版本。 在Java 7更新6,他们改变String.substring()
以使目标串和子串得到不共享支持数组。 这消除了潜在存储泄漏问题substring
。
该substring
方法不把参照原字符串的新的String。 其实际作用是保存到原始字符串的支持数组的引用; 即保持所述字符阵列。
不过话说回来,分配null
到samplel
是不足以使整个原始字符串的状态无法访问。 原始字符串的整个背阵列将保持可...,这意味着它不会被用于垃圾收集的候选者。
但还有另一种并发症。 您可以设置sample1
为字符串文字,并表示一个字符串文字字符串对象总是到达(除非整个班级被卸载!)
但是,通过显式定义样品1为空,将样本1和SAMPLE2是可用于垃圾回收?
原来sample1
对象将保持完全可达, sample2
仍将是可达的,除非该变量超出范围。
如果sample1
一直没文字并有以任何其它引用,那么答案将是不同的。 所述sample1
对象将是不可访问的,但其背衬阵列仍然会经由可达sample2
。
在第二个例子中,复制子导致创建一个新的String。 它保证了新的字符串不会分享与原来的字符串和临时串的支持数组。 在这种情况下,分配null
是不必要的。
现在都SAMPLE1和SAMPLE2是可用于垃圾回收?
答案是一样的上述对于其中的情况下sample1
是文字。
如果sample1
是不是文字,也没有其他的引用,然后sample1
和临时子现在是无法访问。
我只是想知道哪里String构造是有帮助的。
理论上这将是。
实际上它取决于引用是否仍可达当GC最终得到周围寻找......并且还取决于是否弦乐问题足够大,足以众多会对内存使用量的显著影响。
而在实践中, 通常前提条件没有满足,创造一个新的字符串一样, 通常不会帮助。
请记住,在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?