做SoftReference
和WeakReference
何时为实例变量创建真的只有帮助?在方法范围内使用它们有什么好处?
另一个重要部分是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
问题内容: 以下代码可以正常工作: 如果我取消注释以下行: 启用SSL连接并使用此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 类:将字符数组转换为字符输入流,