当前位置: 首页 > 知识库问答 >
问题:

Java如何防止一个尚未分配的实例被垃圾收集?

狄彬彬
2023-03-14

示例:

public void foo() {
    A a = new A();
}

如果有这样的事件序列呢?

  1. Java为A分配内存
  2. 运行a()构造函数。现在堆中有一个实例。
  3. GC运行。
  4. 对象没有引用,在分配给A之前将其删除。

它如何防止这种情况发生?我将非常感谢链接到文章的解释。

共有1个答案

戚成礼
2023-03-14

一旦知道GC遍历了堆栈,这就很容易回答了。因此,当它遍历foo方法的堆栈时,它只知道有引用(a)指向该堆内存。

为了知道什么是垃圾,GC必须首先扫描所有活着的东西。因为存在指向该内存的引用(新的A());至少在某个线程在某处使用A之前,它是活的。

 类似资料:
  • 问题内容: 如何防止对象收集垃圾? 是否有通过终结或幻影引用的方法或任何其他方法? 采访中有人问我这个问题。面试官建议可以使用。 问题答案: 保持参考。如果过早地收集了对象,则表明您的应用程序设计中存在错误。 垃圾收集器仅收集应用程序中没有引用的对象。如果没有可以自然引用所收集对象的对象,请问自己为什么要保持它的生命。 通常没有引用但想要保留一个对象的一个​​用例是单例。在这种情况下,您可以使用静

  • UPD 21.11.2017:该bug在JDK中被修复,参见Vicente Romero的评论 摘要: 如果语句用于任何实现,则集合将保留在堆内存中,直到当前作用域(方法、语句体)结束,即使您没有对集合的任何其他引用,并且应用程序需要分配新内存,也不会被垃圾收集。 在运行时,我有: 第一次内存分配前:最大176640K的1251K 第一次内存分配后:最大176640K的131426K 为了避免在函

  • 问题内容: UPD 21.11.2017: 该错误已在JDK中修复,请参见Vicente Romero的评论 摘要: 如果将语句用于任何实现,则集合将一直保留在堆内存中,直到当前作用域(方法,语句主体)结束为止,即使您没有对该集合和应用程序的任何其他引用,也不会进行垃圾回收需要分配一个新的内存。 http://bugs.java.com/bugdatabase/view_bug.do?bug_id

  • 问题内容: 首先,我想澄清一下我的理解,因为以下问题是相同的。 上面代码的输出是 这意味着,尽管一旦GC运行,实际的对象对象就会被垃圾回收,但是内存中仍然有一个类对象,该对象此时不指向任何对象。 现在考虑到上述理解为真,我对工作原理感到困惑。在下面的代码中 输出: 现在的 问题 是,据说输入是弱引用,这意味着在上面的代码中, 成为实际对象时可以进行垃圾回收,因为不再有对该对象的强引用,但是 和作为

  • 问题内容: 我想触发许多一次性异步CompletableFutures,例如: 理想情况下,可以在完成后将这些CompletableFutures进行垃圾回收。但是,由于我没有存储参考文献,因此是否有事先收集它们的风险? 问题答案: 您不是在显式地存储引用,而是在内部。该方法创建一个,然后向其提交引用的任务(如果您使用的是公共池)。在返回的变成了依赖于第一,因此也被引用。 一旦完成的执行,将第一个

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄