gpt4 book ai didi

java - Java 中字符串的垃圾回收是如何进行的?

转载 作者:行者123 更新时间:2023-11-30 04:14:55 28 4
gpt4 key购买 nike

我正在阅读有关 JVM 内存管理的内容,如果一个对象不再有对其的引用,它将被垃圾收集。可以说,我有一个程序

public test {
public static void main(String[ ] args) {
String name = "hello";
for (int i =0 ; i < 5; i++) {
System.out.println(i);
}
}
}

正如您所看到的,String name 没有在任何地方使用,因此它的引用始终保留,并且不会被垃圾收集。

现在我有了,

String name = "hello"
String name2 = name.substring(1,4)//"ell"

同样,hello 的引用必须始终存在,并且不能被垃圾回收,因为 name2 使用它。

那么这些String或任何对象什么时候会被垃圾收集,它们具有引用但已过时,即不再在代码中使用?

我可以看到一种情况,其中修剪数组会导致内存泄漏,因此将其引用设置为 null 是垃圾收集这些过时引用的好方法。

最佳答案

I can see one scenario where trimming down an array causes memory leak and hence setting its reference to null is a good way to garbage collect those obsolete references.

字符串是引用类型,因此与垃圾收集相关的引用类型的所有规则都适用于字符串。 JVM 也可能对字符串文字进行一些优化,但如果您担心这些,那么您可能想得太难了。

JVM什么时候收集未引用的对象?

唯一重要的答案是:你无法判断,也不需要永远判断,但如果确实如此,你也不知道什么时候会发生。您永远不应该围绕确定性垃圾收集编写 Java 代码。这是不必要的,而且充满丑陋。

一般来说,如果您将引用变量(包括引用类型的数组或集合)限制在尽可能窄的范围内,那么您就不必担心内存泄漏了。长寿的引用类型需要一些照顾和喂养。

“修剪”数组(通过分配 null 来取消引用数组元素)在数组代表您自己的内存管理系统的特殊情况下是必要的,例如。如果您正在创建自己的对象缓存或队列。

因为 JVM 无法知道您的数组正在“管理内存”,所以它无法收集其中仍被引用但已过期的未使用对象。如果数组代表您自己的内存管理系统,那么您应该将 null 分配给其对象已过期(例如从队列中弹出;J. Bloch,Essential Java,第 2 版)的数组元素。 )。

关于java - Java 中字符串的垃圾回收是如何进行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18647579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com