Sta*_*Man 12 java caching memory-management ehcache
我正在寻找一个简单的内存(和进程中)缓存,用于查询数据的短期缓存(但短期意义超出请求/响应,即会话边界).EhCache可能会工作,但看起来好像它可能不提供我需要的东西:限制不是缓存的对象数量,而是(大致)限制缓存数据消耗的内存量.
我知道很难在没有序列化的情况下找出给定对象的确切内存使用情况(我想避免在一般情况下因为它的速度慢而无法实现我的用途),而且我自己也不得不提供大小估计.
那么:是否有一个简单的开源java缓存,允许定义缓存对象的"权重",以限制缓存的事物数量?
编辑(2010年11月):对于它的价值,有一个名为Java CacheMate的新项目试图解决这个问题,以及其他一些改进的想法(多级内存中进程缓存)
我同意 Paul 的观点,即这通常可以通过使用软引用缓存来解决,尽管它可能会比您希望的更早地逐出条目。通常可接受的解决方案是使用普通缓存,将其逐出到软缓存,并在可能的情况下恢复未命中的条目。这种受害者缓存方法效果很好,为您提供了较低的标准,但如果有可用内存,则会带来额外的好处。
内存大小可以通过启用 Java 代理来确定,并且使用 SizeOf 实用程序 ( http://sourceforge.net/projects/sizeof ) 时使用非常简单。我仅将其用于调试目的,并且我建议在将其用于正常使用之前对开销进行基准测试。
在我的缓存库中,我计划在实现核心算法后添加插入评估器的功能。通过这种方式,您可以将集合存储为值,但通过所有集合大小的总和来限制缓存。我已经看到无界集合作为缓存中的值会导致 OutOfMemoryExceptions,因此进行控制非常方便。
如果您确实需要这个(我建议不要这样做),我们可以增强我当前的实现来支持这一点。您可以给我发电子邮件,ben.manes-at-gmail.com。