运行时的Ehcache缓存大小

我正在生产中运行一个大型VM,并希望在运行时了解有关我的缓存大小的更多信息。 我的缓存都基于ehache

在运行时查看单个缓存大小的最佳方法是什么。 使用JMX或API

是否有任何选项可以通过对CacheManager的普通旧java调用进行配置,或者(暂时忽略JMX)是否必须在一个大字符串中构建XML配置slug?

是的,使用Ehcache,您可以配置缓存并仅通过Java代码检索其大小(无XML配置)。 集成一切的确切方法取决于您的特定架构; 我打算假设泽西做API和Guice用于dependency injection。

定义缓存

通过dependency injection使缓存管理器可用。 这可以通过Guice模块完成:

@Provides @Singleton CacheManager provideCacheManager() { CacheManager cacheManager = CacheManager.create(); /* very basic cache configuration */ CacheConfiguration config = new CacheConfiguration("mycache", 100) .timeToLiveSeconds(60) .timeToIdleSeconds(30) .statistics(true); Cache myCache = new Cache(config); cacheManager.addCacheIfAbsent(myCache); return cacheManager; } 

请注意, mycache统计信息已打开。

同样,使用缓存可以完全使用Java代码完成,但取决于您的体系结构和设计。 通常我使用方法拦截(通过AOP)这样做,但这是另一个主题。

通过REST API获取缓存统计信息

鉴于您的CacheManager可通过dependency injection获得,然后您可以将其连接到REST端点并允许访问缓存统计信息:

 @Path("stats") @Produces("text/plain") public class StatsResource { @Inject private CacheManager cacheManager; @GET public String stats() { StringBuffer sb = StringBuffer(); /* get stats for all known caches */ for (String name : cacheManager.getCacheNames()) { Cache cache = cacheManager.getCache(name); Statistics stats = cache.getStatistics(); sb.append(String.format("%s: %s objects, %s hits, %s misses\n", name, stats.getObjectCount(), stats.getCacheHits(), stats.getCacheMisses() )); } return sb.toString(); } } 

现在,您可以通过REST调用获取有关缓存的信息:

 GET /stats HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 mycache: 8 objects, 59 hits, 12 misses 

那么JMX呢?

Ehcache使您可以轻松地使用MBean服务器注册缓存管理器。 它可以用Java代码完成。 更新Guice模块,将cacheManager注册到系统MBeanServer

 MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true); 

现在,您可以将JConsole附加到Java进程,并在MBean net.sf.ehcache.CacheStatistics查找缓存统计信息。

JMX绝对是一个可行的解决方案。 EhCache文档有一个专门针对此的页面 。

这是通过JMX配置EhCache 的示例 。 链接的文章包含一个Spring配置,但如果您不使用Spring,它很容易转换为原生Java。

在EhCache 3中(至少在我使用的3.5版本中),您可以通过缓存统计信息访问缓存大小。

首先,您需要在缓存管理器上注册统计服务:

 StatisticsService statisticsService = new DefaultStatisticsService(); CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .using(statisticsService) .build(); cacheManager.init(); 

然后,您可以检索缓存中的统计信息,它包含按层的大小(在EhCache 3中,您有三个不同的层:堆,磁盘和offheap)

 CacheStatistics ehCacheStat = statisticsService.getCacheStatistics("myCache"); ehCacheStat.getTierStatistics().get("OnHeap").getMappings();//nb element in heap tier ehCacheStat.getTierStatistics().get("OnHeap").getOccupiedByteSize()//size of the tier