java - 任何可以限制内存缓存的内存使用的 Java 缓存,而不仅仅是实例计数?

标签 java caching memory-management ehcache

我正在寻找一个简单的内存中(和进程中)缓存,用于查询数据的短期缓存(但短期含义超出请求/响应,即 session 边界)。 EhCache 可能会工作,但看起来它可能无法提供我需要的一件事:不是限制缓存的对象数量,而是(近似)限制缓存数据消耗的内存量。

我知道在没有序列化的情况下很难计算出给定对象的确切内存使用情况(我想在一般情况下避免这种情况,因为它的速度慢违背了我使用的目的),我可以接受必须提供大小估计我自己。

那么:是否有一个简单的开源 Java 缓存允许定义缓存对象的“权重”,以限制缓存的事物数量?

编辑(2010 年 11 月):就其值(value)而言,有一个名为 Java CacheMate 的新项目试图解决这个问题,以及一些其他的改进想法(多级内存进程内缓存)

最佳答案

我同意 Paul 的观点,这通常可以通过使用软引用缓存来解决,尽管它可能会比您希望的更早地逐出条目。一个通常可以接受的解决方案是使用一个普通的缓存,它会逐出到软缓存,并在可能的情况下恢复未命中的条目。这种受害者缓存方法非常有效,如果有空闲内存可用,给你一个较低的阈值但额外的好处。

内存大小可以通过启用 Java 代理来确定,使用 SizeOf 实用程序 (http://sourceforge.net/projects/sizeof) 时使用起来非常简单。我仅将其用于调试目的,我建议在将其用于正常使用之前对开销进行基准测试。

在我的缓存库中,我计划在核心算法实现后添加插入求值器的功能。通过这种方式,您可以将集合存储为值,但将缓存限制为所有集合大小的总和。我见过无限集合,因为缓存中的值会导致 OutOfMemoryExceptions,因此控制非常方便。

如果您真的需要这个,而我建议您不要这样做,我们可以增强我当前的实现来支持它。你可以给我发电子邮件,ben.manes-at-gmail.com。

关于java - 任何可以限制内存缓存的内存使用的 Java 缓存,而不仅仅是实例计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/690805/

相关文章:

java - 在JavaFX中,如何以编程方式将滚动 Pane 滚动到底部?

java - 使用分页从redis缓存中检索数据

ruby-on-rails - Rails 3/Heroku/Memcached - 未命中/未命中、存储/新鲜

java - Swing线程通信

java - 使用 Eclipse 远程调试 'eclipse RCP application"

java - 使用 @TimeToLive 为 Redis Spring 缓存设置特定于 key 的 TTL 不会触发失效

memory-management - 表、嵌套表的 Lua 垃圾收集

ios - 如何在 ARC 下的 Instruments 中激活 Cycles 报告?

c++ - 是否可以在C++中调用delete时阻止析构函数运行?

java - 嵌入式与非嵌入式 Java 服务器