12

我已经javax.cache.Cache了解了它的用法和行为。据称,

JCache 是一种类似 Map 的数据结构,提供应用程序数据的临时存储。

JCache 和 HashMap 将元素存储在本地 Heap 内存中,默认情况下没有持久化行为。通过实现自定义CacheLoaderCacheWriter我们可以实现持久化。除此之外,什么时候使用它?

4

3 回答 3

12

缓存通常比地图有更多的管理逻辑,地图只是一个或多或少简单的数据结构。

一些概念,JCaches 可能实现

  • 过期:条目可能会在一段时间后或自上次使用后过期并从缓存中删除
  • 驱逐:如果空间有限,元素将从缓存中删除。可能有不同的驱逐策略。LRU,先进先出,...
  • 分布:即在集群中,而 Maps 是 JVM 本地的
  • 持久性:缓存中的元素可以持久存在并在重启后存在,地图的内容只是丢失了
  • 更多内存:缓存实现可能使用比 JVM 堆提供的更多内存,使用一种称为BigMemory的技术,其中对象被序列化到单独分配的字节缓冲区中。此 JVM 外部内存由操作系统(分页)而不是 JVM 管理
  • 按值或按引用存储键和值的选项(在地图中您自己处理)
  • 应用安全的选项

其中一些是更通用的JCache概念,一些是缓存提供者的具体实现细节

于 2016-06-08T07:16:08.683 回答
1

这是两个对象之间的五个主要区别。

与 java.util.Map 不同,缓存:

  • 不允许空键或值。尝试使用 null 将导致 java.lang.NullPointerException
  • 当请求的值不在缓存中时,提供从 javax.cache.integration.CacheLoader 读取值的能力(通过缓存读取)
  • 当从缓存中创建/更新/删除值时,提供将值写入 javax.cache.integration.CacheWriter(通过缓存写入)的能力
  • 提供观察缓存条目变化的能力
  • 可以捕获和测量运营统计数据

资料来源:GrepCode.com

于 2016-06-08T07:12:47.410 回答
1

大多数情况下,缓存实现使这些缓存对象远离堆(在 GC 范围之外)。GC 跟踪在 java 中分配的每个对象。想象一下,您在内存中有数百万个对象。如果这些对象不是堆外对象,相信我,GC 将使您的应用程序性能变得糟糕。

于 2019-02-02T01:43:53.250 回答