7

我正在生产中运行一个大型 VM,并且想在运行时更多地了解我的缓存大小。我的缓存都是基于 ehache

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

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

4

3 回答 3

17

是的,使用 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

于 2013-10-08T12:56:45.757 回答
1

在 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
于 2018-03-15T16:27:39.890 回答
0

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

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

于 2012-11-05T10:36:39.000 回答