我已经了解了javax.cache.Cache
的用法和行为。据称,
JCache是一种类似Map的数据结构,它提供应用程序数据。
JCache和HashMap将元素存储在本地堆内存中,默认情况下不具有持久性行为。通过实现自定义的CacheLoader
和CacheWriter
,我们可以实现持久性。除此之外,什么时候使用?
缓存通常比映射有更多的管理逻辑,映射只是一个或多或少简单的数据结构。
一些概念,JCaches可能实现
- 过期:条目可能在一段时间后或上次使用后过期并从缓存中删除
- 逐出:如果空间有限,将从缓存中删除元素。可以有不同的驱逐策略,例如LRU、FIFO
- 分布:即在集群中,而映射是JVM的本地映射
- 持久性:缓存中的元素可以是持久的,并且在重新启动后存在,Map的内容只是丢失
- 更多内存:缓存实现可能使用比JVM堆提供的内存更多的内存,使用一种名为BigMemory的技术,其中对象被序列化到单独分配的字节缓冲区中。这个JVM外部内存由操作系统(分页)管理,而不是JVM
- 通过值或引用存储键和值的选项(在地图中,您可以自己处理)
- 应用安全性的选项
其中一些是JCache的一般概念,一些是缓存提供程序的具体实现细节
以下是两个对象之间的五个主要区别。
与java.util.Map不同,缓存:
- 不允许空键或值。尝试使用null将导致java.lang.NullPointerException
- 当请求的值不在缓存中
- 当正在从缓存中创建/更新/删除的值
- 提供观察缓存项更改的能力
- 可以捕获和测量操作统计数据
来源:GrepCode.com
大多数情况下,缓存实现会使那些缓存的对象远离堆(GC无法访问)。GC跟踪在java中分配的每个对象。想象一下,你的内存中有数百万个对象。如果这些对象不是堆外的,相信我,GC会让你的应用程序性能变得糟糕。