我正在生产中运行一个大型 VM,并且想在运行时更多地了解我的缓存大小。我的缓存都是基于 ehache
在运行时查看单个缓存大小的最佳方法是什么。使用 JMX 或 API
是否有任何选项可以通过对 CacheManager 的普通旧 java 调用进行配置,或者(暂时忽略 JMX)必须在一个大字符串中构建 XML 配置吗?
是的,使用 Ehcache,您可以配置缓存并仅通过 Java 代码检索它们的大小(无 XML 配置)。集成一切的确切方式取决于您的特定架构;我将假设 Jersey 做 API 的东西,Guice 做依赖注入。
定义缓存
通过依赖注入使您的缓存管理器可用。这可以通过 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
可以通过依赖注入获得,您可以将其连接到 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
。
在 EhCache 3 中(至少在我使用的 3.5 版本中),您可以通过缓存统计信息访问缓存大小。
首先,您需要在缓存管理器上注册统计服务:
StatisticsService statisticsService = new DefaultStatisticsService();
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.using(statisticsService)
.build();
cacheManager.init();
然后,您可以检索缓存上的统计信息,它包含按层排列的大小(在 EhCache 3 中,您有三个不同的层:堆、磁盘和堆外)
CacheStatistics ehCacheStat = statisticsService.getCacheStatistics("myCache");
ehCacheStat.getTierStatistics().get("OnHeap").getMappings();//nb element in heap tier
ehCacheStat.getTierStatistics().get("OnHeap").getOccupiedByteSize()//size of the tier
JMX 绝对是一个可行的解决方案。EhCache 文档有一个专门用于此的页面。
这是一个通过 JMX 配置 EhCache 的示例。链接的文章包含一个 Spring 配置,但如果您不使用 Spring,它很容易转换为原生 Java。