首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在方法调用期间创建的本地Java对象的生命周期

在方法调用期间创建的本地Java对象的生命周期
EN

Stack Overflow用户
提问于 2010-12-30 03:34:42
回答 3查看 8.2K关注 0票数 7

在方法调用中,如果我在调用期间创建了一个对象。什么时候对这些对象进行垃圾回收?

将它们放在堆上,然后与堆上的其他对象一起进行垃圾回收。或者它们被垃圾回收了,因为它们是不需要的。该方法的执行已经完成。

EN

回答 3

Stack Overflow用户

发布于 2010-12-30 03:37:22

当方法关闭时,在方法范围内创建的对象有资格进行垃圾回收-除非该引用被作为返回值传回。在这种情况下,调用者可能会也可能不会挂起该引用,并阻止它被gc。

由于垃圾收集器根据自己的情况在自己的线程上运行,因此您不一定知道对象何时被清理,或者分配到其他地方的对象是否也符合条件。

票数 6
EN

Stack Overflow用户

发布于 2010-12-30 03:46:33

这并不容易--最终每个对象都是用某种方法创建的。

VM /编译器需要进行转义路径分析,以检测此对象的引用是否可以以某种方式转义-想象一下调用newObject.toString()。你和我都知道(希望)这不会有什么坏处,并且对象仍然没有被引用,因为它不会将自己链接到全局变量。但VM并非如此。

虽然现代VM会进行这样的分析,并在垃圾收集方面特别对待真实的短期对象,但从“高层次”的角度来看,它们只是对象。其他一切都是复杂的低级优化。

无论如何,正如duffymo所说--这个对象到底什么时候被释放是不确定的。

票数 3
EN

Stack Overflow用户

发布于 2010-12-30 06:55:03

方法的执行已经结束,现在对象不在作用域之外,这一点无关紧要。

垃圾回收是运行时系统的一种隐式操作,它在与代码并行的单独线程中运行,实现特定的垃圾回收算法。

垃圾收集线程以不可预测的时间运行--但根据java文档,通常每秒运行一次,并且当内存几乎耗尽时,评估哪些对象有资格被垃圾收集,即不存在来自根指针(例如静态变量)的对它们的引用。

因此,根指针可以访问的每个对象都被标记,然后递归地标记这些对象引用的对象,等等。

这可能意味着扫描整个进程空间。一旦完成,所有未从上次扫描中“标记”的对象都将进入空闲列表(被GC'd)。

正如您所看到的,这是一个繁重的操作。

该方法的执行已经完成。

因此,你不在你所调用的方法的作用域之外,因为它已经完成了,这一事实是不相关的。这并不意味着运行时知道对象已经完成(因为GC是并行运行的)。

这与在C++中不同,在方法的末尾,程序员会调用对象上的delete,因为它是不需要的。在Java中,不会在方法的末尾自动调用"delete“。

GC线程最终会意识到,不再有方法和CG对堆上分配的对象的引用。

如果需要,您可以通过以下方式随时调用GC:

代码语言:javascript
复制
System.gc();

但是GC迟早会运行。

需要注意的一件事是,只要根指针引用了一个方法,它就不能是GC的。

因此,如果您在方法中通过new在堆上创建了一个对象,并将引用存储在静态容器中或将其返回给调用者,则该对象的存留期将超过该方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4557209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档