gpt4 book ai didi

java - 先前分配的对象的垃圾收集

转载 作者:行者123 更新时间:2023-12-01 06:32:58 24 4
gpt4 key购买 nike

考虑以下场景:

String dude = "Harold";

//some stuff

dude = "Kumar";

一旦为dude分配了第二个值“Kumar”,一个与“Harold”分开的全新对象就出现了。我想知道的是,既然“Harold”显然不再有任何用处,那么它是立即被垃圾收集还是在稍后 JVM 认为合适的时候收集?

更新:

仅仅因为dude已被设置为新值(对象)并不一定意味着对旧对象的所有引用都已被消除。如果另一个引用在“Harold”之后和“Kumar”之前调用 dude,它显然会保留“Harold”对象:

String dude = "Harold";

//some stuff

String interim = dude;

dude = "Kumar";

System.out.println("dude = " + dude);
System.out.println("interim = " + interim);

打印

dude = Kumar
interim = Harold

因此,需要考虑的因素比我最初设想的要多,因此更改后初始值不一定超出范围。

最佳答案

没有任何东西会立即被垃圾收集,并且不鼓励尝试强制垃圾收集(并且随着每个 java 版本的发布而变得越来越困难)。
是的,一旦“Harold”不再可达(没有指针链指向它),它就有资格进行垃圾收集,并且可能会被收集(如果 GC 曾经运行过)。话虽如此,字符串可以在 const 池中分配,该池驻留在 perm gen 中并且不会被 GC'ed*(至少在 java 7 之前)。有关实习字符串的更多信息:http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html

* - 不完全准确,即使 const 池位于 perm gen 中,也会被 GC 处理。很复杂。

关于java - 先前分配的对象的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836598/

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