- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 SoftReference<T>
获取任何代码要进行全面测试,必须想出某种方法来测试“是的,它已被取消”的情况。人们可能或多或少地通过使用“for-test”代码路径强制引用为空来模拟这一点,但这不会像 GC 那样管理队列。我想知道是否有人可以分享建立一个可重复、受控环境的经验,在这个环境中,实际上 GC 会被激发进行收集和清零?
最佳答案
我会将问题分为两部分:
对于 #1,我会使用一个 Mock,它返回具有足够变化的 null(有时是 null,有时是真实对象)来测试您认为您将使用 GC 的所有相关场景。那就是单元测试。
接下来真的是一个集成测试,看看GC的行为WRT SoftReference是否如你所料。我不确定我是否会努力完全自动化这样的测试,除非在更大的负载测试环境中,但如果这很重要,我会启动一个具有非常紧凑的最大内存量的 JVM 并加载足够的内存来触发软引用收集。失败的路径是让代码不使用软引用,加载的内存应该会导致 OutOfMemory 错误。然后通过转换为软引用使测试通过。测试的目的应该是断言单元测试中关于行为的假设。
关于java - 测试使用 SoftReference<T> 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814039/
我的 Android 应用程序中有一个位图缓存,其中通过 SoftReference 引用位图。然而,位图被清空得太早了。缓存中最多可以有 20 个位图,如果我加载更多,GC 开始清空 SoftRef
Map> cache = new ConcurrentHashMap>(); 我已经 map 声明了一个类似于上面的 map ,我将其用作缓存。 问题是我要在将项目添加到缓存后立即对缓存执行所有操作,
我有一个创建一系列位图的应用程序。我将这些位图保存在 SoftReferences 中,以避免内存不足。我希望堆大小在开始收集我的 SoftReferences 之前增长到最大 16MB。然而,Sof
JDK 7 文档中有关于 SoftReference 的内容。 : "All soft references to softly-reachable objects are guaranteed to
我正在为我的 Android 应用程序实现缓存机制。 我使用 SoftReference,就像我发现的许多示例一样。问题是,当我在 ListView 中向上或向下滚动时,大部分 图像已经被清除。我可以
我正在为缓存实现测试 SoftReference,我发现了一个奇怪的行为: 我有一个 setName(String name) 方法,它通过 SoftReference 设置 Graph 对象的名称:
我正在使用一个搜索库,它建议将搜索句柄对象保持打开状态,因为这有利于查询缓存。随着时间的推移,我观察到缓存趋于膨胀(几百兆并不断增长)并且 OOM 开始出现。没有办法强制执行此缓存的限制,也没有计划它
看起来 Dalvik 的垃圾收集器不尊重 SoftReferences 并尽快删除它们,就像 WeakReferences 一样。我还不是 100% 确定,但尽管事实上仍有大约 3MB 的可用内存,但
我的应用程序出现了 OutOfMemoryError。当我阅读一些教程时,我开始知道,我可以通过使用 Softreference/Weakreference 来解决这个问题。但是我不知道如何使用Sof
我有一些代码使用了 SoftReference 子类的许多实例。我想测试它在所有/只有一些/没有这些引用被暂存以在 ReferenceQueue 中清除的情况下是否正常工作。对于“无”的情况,这很简单
请解释一下弱引用的用途。我通常确实了解 Java 概念,但这一个给我带来了麻烦。 我确实理解弱引用是什么,但它们的用法和性质在我的脑海中有点模糊。我无法想象一个正确的场景,其中使用弱引用成为必要。 我
编辑 到目前为止,大多数答案都集中在我错误地扩展 map 这一事实上。我已在示例代码中更正了此问题,但类型问题仍然存在,问题仍然存在。 我试图在 Scala 中实现 SoftHashMap,但遇到了类
我在这个 link 上找到了文档描述如下: 弱引用对于映射很有用,一旦它们不再被引用(从外部),应该自动删除它们的条目。 SoftReference 和 WeakReference 之间的区别在于决定
创建这么多Strong Reference会出现OOM错误是因为GC不会收集Strong Reference,但是如果没有额外的内存,GC会收集Weak Reference。所以我的问题是:我在设置
我在处理软引用和弱引用时遇到了问题。代码有一个可以切换的标志软引用和弱引用之间的所有逻辑。虽然引用很弱,但似乎为了工作正常,使用软引用我一直得到 OutOfMemoryError。这种情况发生在 Ma
使用 SoftReference 获取任何代码要进行全面测试,必须想出某种方法来测试“是的,它已被取消”的情况。人们可能或多或少地通过使用“for-test”代码路径强制引用为空来模拟这一点,但这不会
我实现了一个自定义适配器来创建一个显示与位置相关的信息的对话框(对话框的每个条目都包含一个图像、一个显示地址的文本字段和一个显示城市和国家/地区的文本字段。)在适配器的 getView (...) 方
我正在使用一个内部数据库连接池来缓存PreparedStatements。当连接返回到池中时,缓存的Statement并没有关闭。这些会在 mySQL 驱动程序中创建 OutOfMemoryExcep
我之前得出的结论是,如果您需要一个具有基于值(等于)的相等性的 SoftReference,那么设计就会很糟糕,但内部人员除外。这是继 Google Collections 和 Guava 之后,不包
我有一个包含 100 张不同图像的 ListView 。我的缓存如下所示, public class ImageCache { HashMap> myCache; .... .
我是一名优秀的程序员,十分优秀!