gpt4 book ai didi

Java 垃圾收集和集合

转载 作者:行者123 更新时间:2023-12-02 03:44:51 25 4
gpt4 key购买 nike

假设我做了这样的事情:

List<Stuff> methodA() {
List<Stuff> all_the_stuff_to_do = new ArrayList<>();
all_the_stuff_to_do.add(new Stuff("important"));
all_the_stuff_to_do.add(new Stuff("not important"));
return all_the_stuff_to_do;
}

List<Stuff> methodB() {
List<Stuff> important_stuff_to_do = new ArrayList<>();
Stuff important = methodA().get(0);

// at this point Stuff("not important") is not reachable anymore
// since I have no reference to the list that contains it left

important_stuff_to_do.add(important);
return important_stuff_to_do;
}

void methodC() {
... do a happydance ...

List<Stuff> stuff_to_do = methodB();

... look sad because now I got important stuff to do ...
}

***** 编辑 *****
更好的说明和简化的代码

澄清一下:

退出methodA()时,我得到了一个包含两个对象Stuff("important")Stuff("not important")<的列表的引用/strong>

我将对 Stuff("important") 的引用添加到 methodB() 中的列表中。此时,对象 Stuff("not important") 不再可达。此外,methodA() 中的列表也不再可达。

但是列表仍然包含对确实可访问的对象的引用,即Stuff("important")

什么时候会清除all_the_stuff_to_do列表以及Stuff(“不重要”)对象?

它会直接在调用MethodA之后吗?还是会在MethodB的末尾?或者永远不会,因为它包含对 Stuff("important") 对象的引用,该对象在程序结束之前仍然处于 Activity 状态?

最佳答案

Will (all_the_stuff_to_do be garbage collected) directly after the Call to MethodA? Or will it be at the end of MethodB? Or never since it contains a reference to the Stuff("important") Object that is still active till the end of the program?

垃圾收集通常在低优先级线程上完成。如果没有采取任何其他措施,垃圾收集器可能会运行。

如果虚拟机内存不足或内存不足,垃圾收集器可能会立即作为最高优先级线程运行,因为它需要恢复内存以满​​足程序的即时需要。

那么,调用MethodA后会直接收集吗?不会。调用 get(0) 后会收集它吗?有可能,但可能性不大。在MethodB的末尾?有可能,但可能性不大。计划结束后仍然活跃吗?有可能,但只有当程序永远不会耗尽内存并且永远不会空闲时才有可能。

列表包含“Stuff("important") Object”的副本这一事实与列表是否被收集无关。如果没有可访问对象引用该列表,则该列表符合垃圾回收条件。

列表在收集期间会被#clear()处理吗?不,没有必要。如果它是用户定义的集合,则 clear 方法可以执行任何操作,包括添加另一个对列表的引用,这会扰乱垃圾收集。相反,它只是被收集,并且列表引用的对象被引用一次。其中包括“Stuff(“important”) Object”...它的引用计数将减少,但由于引用仍然存在,因此不会被清除。

关于Java 垃圾收集和集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36407601/

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