当前位置: 首页 > 面试题库 >

另一个字符串的子字符串会阻止父字符串被垃圾回收吗?

屈畅
2023-03-14
问题内容
String samplel = "ToBeGarbageCollected";
String sample2 = samplel.substring(0, 1);
samplel = null;

我知道子字符串内部会保留原始字符串的引用。

但是通过显式定义samplelnull,sample1和sample2是否可用于垃圾回收?

我记得在某处看到是否将父对象显式设置为null所有子值都可用于垃圾回收。这对上述内容有好处吗?我只是好奇这是否是父母子女关系的情景?如果不是,将这项事业sample1或者sample2是可用于垃圾回收?

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

问题答案:

首先要说的是,垃圾回收不会立即发生。因此,分配null任何东西不会/不会 导致 垃圾回收。什么是 可以 做的是使一个对象变得 不可达
…这将使其在未来的GC运行垃圾收集的潜在候选。

现在到您的具体示例。

重要说明: 以下内容 适用于较早的JVM;即Java 7 update 5和更早版本。在Java
7更新6中,它们进行了更改String.substring(),以使目标字符串和结果子字符串不共享后备数组。这消除了潜在的存储泄漏问题substring

substring方法不会在新String中放置对原始String的引用。它实际上所做的是保存对原始String的后备数组的引用。即包含字符的数组。

不过话说回来,分配nullsamplel不足以使整个原始字符串的状态无法访问。原始String的 整个
支持数组将保持可访问的状态…这意味着它将不适合进行垃圾回收。

但是还有另一个复杂之处。您设置sample1为String文字,并且表示String文字的String对象 始终 可访问(除非整个类都被卸载!)

但是通过将samplel显式定义为null,sample1和sample2是否可用于垃圾回收?

原始sample1对象将保持完全可访问,并且sample2除非该变量超出范围,否则将保持可访问。

如果sample1不是文字,并且没有其他引用,那么答案将有所不同。该sample1对象将不可访问,但其后备数组仍可通过访问sample2

在第二个示例中,复制子字符串会导致创建新的String。并且可以确保新的String不会与原始String和临时子字符串共享后备数组。在这种情况下,分配null是不必要的。

现在,sample1和sample2都可用于垃圾回收吗?

对于sample1文字的情况,答案与上述相同。

如果sample1不是文字,并且没有其他引用,那么sample1临时子字符串现在将无法访问。

我只想知道String构造函数在哪里有帮助。

从理论上讲将会如此。

在实践中,这取决于GC最终查找时引用是否仍可访问……以及所讨论的字符串是否足够大且足够多,从而对内存使用量产生重大影响。

并且在实践中, 通常 不满足该前提条件,并且创建这样的新鲜String 通常 无济于事。



 类似资料:
  • 问题内容: 我正在阅读有关垃圾收集的信息,当我搜索字符串文字垃圾收集时,搜索结果令人困惑。 我需要澄清以下几点: 如果在编译时将字符串定义为文字字符串,那么是否会对其进行垃圾回收? 如果使用实习方法,那么它会被垃圾回收吗?在第1点中,它也将与文字区别对待。 有人提到只有在卸载类时才会对文字进行垃圾回收吗?是否有道理,因为我认为永远不会卸课。 问题答案: 如果在编译时将字符串定义为文字字符串,那么是

  • 问题内容: 探索了Java的字符串内部结构之后,我对所谓的“烫发空间”感到困惑。我最初对它的理解是,它包含 字面值 以及此问题中说明的类元数据。 我还阅读了有关该方法的信息,并将其放入字符串池,返回对该方法唯一实例的引用。据我了解,这是与存在于JVM的perm空间中的String字符串相同的字符串池。在我看来,“烫发空间”是不可能修改的(毕竟它是永久的,是吗?)。但是,然后我发现了这个问题,EJP

  • 在Java中,当一个对象没有实时引用时,它就有资格进行垃圾回收。对于字符串,情况并非如此,因为字符串将进入字符串池,而JVM将保持对象活动以供重用。这意味着字符串一旦创建就永远不会被垃圾收集?

  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 我有一个逗号分层的字符串,当调用时,它返回大约60的数组大小。在特定的用例中,我只需要从数组中返回第二个值的值。例如,

  • 如何检查一个字符串是否在另一个字符串中,但匹配项需要在前面,而不是中间或最后。例如,a="