【问题标题】:How to make an object that is not garbage collected? [duplicate]如何制作不被垃圾收集的对象? [复制]
【发布时间】:2012-10-31 11:45:28
【问题描述】:

可能重复:
How to prevent an object from getting garbage collected?
In java when does an object become unreachable?

我在一次采访中被问到这个问题:

我应该如何处理一个对象,以使垃圾收集器无法访问它?

【问题讨论】:

  • “无法到达GC”的概念甚至不存在,“无法到达的对象”的概念意味着它有资格进行垃圾回收。换句话说,这听起来是为了混淆,又是一个蹩脚的面试问题(TM)
  • 创建一个 Singleton 对象,将其所有数据写入 finalize(); Methode 到磁盘,如果它存在于私有构造函数中,则读取它。
  • @MeNoMore 这如何防止 GC?问题不在于保存状态,而在于防止 gc,不是吗?
  • @Marko 是对的,没有用例,这个问题很荒谬。如果你想防止一个对象被 GCed,只保留一个对它的引用;否则解决方案应该从你不能这样做的原因出发。
  • (如果他们的面试问题没有以“这是一个面试问题”为前缀,那么他们的面试问题可能会被关闭。)

标签: java garbage-collection


【解决方案1】:

据我所知,垃圾收集器没有“无法访问”的对象。但是 GC 只会收集没有更多引用指向它们的项目。

因此,要“保护它们”,要么将它们声明为 final(常量),要么确保始终有指向变量的引用,例如通过在主操作循环中包含引用。

【讨论】:

    【解决方案2】:

    GC 将管理堆中的任何对象。您可以使对象始终可访问且不被 GC 收集,但不能使对象超出 GC 的范围。

    使数据无法访问的唯一方法是将其从本机内存中的堆中取出,将其写入磁盘,或将其传递给另一个进程。

    顺便说一句,即使在另一个进程中代理的分布式 RMI 对象也可以在不再使用时被 GC 清理。

    【讨论】:

      【解决方案3】:

      使其包含对自身的静态引用(例如单例模式)。

      【讨论】:

      • 这是一种误导:单例模式涉及一个引用对象的类变量。引用自身的对象无关紧要。
      • 它仍然混淆了“对象”和“类”的概念。对象不包含静态引用。
      • 也有可能卸载一个类,在这种情况下,它的静态字段内容可能会被 GC。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多