当前位置: 首页 > 面试题库 >

使用Java的ReferenceQueue

百里胜泫
2023-03-14
问题内容

SoftReferenceWeakReference何时为实例变量创建真的只有帮助?在方法范围内使用它们有什么好处?

另一个重要部分是ReferenceQueue。除了能够跟踪确定垃圾的引用之外,还Reference.enqueue()可以用于强制注册对象以进行垃圾回收吗?

例如,是否值得创建一个方法,该方法在对象中占用一些沉重的内存资源(由强引用保存),并创建引用以将它们排入队列?

Object bigObject;
public void dispose() {
    ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
    WeakReference<Object> ref = new WeakReference<Object>(bigObject, queue);
    bigObject = null;
    ref.enqueue();
}

(想象一下,在这种情况下,Object代表使用大量内存的对象类型…诸如此类BufferedImage

这有现实效果吗?还是这只是浪费代码?


问题答案:

引用队列的一种常见用法是,例如,子类WeakReference附加需要清理的信息,然后轮询ReferenceQueue来获取清理任务。

ReferenceQueue<Foo> fooQueue = new ReferenceQueue<Foo>();

class ReferenceWithCleanup extends WeakReference<Foo> {
  Bar bar;
  ReferenceWithCleanup(Foo foo, Bar bar) {
    super(foo, fooQueue);
    this.bar = bar;
  }
  public void cleanUp() {
    bar.cleanUp();
  }
}

public Thread cleanupThread = new Thread() {
  public void run() {
    while(true) {
      ReferenceWithCleanup ref = (ReferenceWithCleanup)fooQueue.remove();
      ref.cleanUp();
    }
  }
}

public void doStuff() {
  cleanupThread.start();
  Foo foo = new Foo();
  Bar bar = new Bar();
  ReferenceWithCleanup ref = new ReferenceWithCleanup(foo, bar);
  ... // From now on, once you release all non-weak references to foo,
      // then at some indeterminate point in the future, bar.cleanUp() will
      // be run. You can force it by calling ref.enqueue().
}

例如,选择Guava的内部CacheBuilder实现时使用的是这种方法。weakKeys



 类似资料:
  • 问题内容: 我正在制作一个需要基于Java的AES加密和基于JavaScript的解密的应用程序。我正在使用以下代码作为基本形式进行加密。 我试图用来解密的JavaScript是 但是JavaScript解密无法正常工作。我是新手,有人可以告诉我一种无需更改Java代码块即可解决的方法吗? 我尝试使用Base-64解码文本,如下所示: 但还是不好 我尝试了以下建议的解决方案来解决可能的填充问题,但

  • 问题内容: 我了解到Java具有运算符。你能详细说明它的使用位置及其优点吗? 问题答案: 基本上,你检查对象是否是特定类的实例。当你拥有超类或接口类型的对象的引用或参数,并且需要知道实际对象是否具有其他类型(通常更具体)时,通常可以使用它。 例: 请注意,如果你必须经常使用该运算符,通常表明你的设计存在一些缺陷。因此,在设计良好的应用程序中,你应尽可能少使用该运算符(当然,该通用规则也有例外)。

  • 一、 简介 想要使用 HDFS API,需要导入依赖 hadoop-client。如果是 CDH 版本的 Hadoop,还需要额外指明其仓库地址: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or

  • 问题内容: 以下代码可以正常工作: 如果我取消注释以下行: 启用S​​SL连接并使用此URL: 则程序失败,并且错误与证书有关。 那么,我该怎么解决这个问题呢? 问题答案: 引起原因:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderExcept

  • 问题内容: 什么是JavaBean,为什么需要它?既然可以创建具有类和接口结构的所有应用程序?为什么我需要豆子?你能给我一些例子,在这些例子中,bean是必不可少的,而不是类和接口? 请在以下上下文中说明Bean的必要性: Wep apps Standalone apps 问题答案: 它们通常仅代表真实世界的数据。这是一个Javabean的简单示例: 实施并不是强制性的,但是如果你希望能够在Jav

  • 主要内容:字符输入流,字符输出流,字符文件输入流,字符文件输出流,字符缓冲区输入流,字符缓冲区输出流尽管 Java 中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但利用它却不能直接操作 16 位的 Unicode 字符。这就要用到字符流。本节将重点介绍字符流的操作。 字符输入流 Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。 Reader 类的常用子类如下。 CharArrayReader 类:将字符数组转换为字符输入流,