我正在生产中运行一个大型虚拟机,并且希望在运行时更多地了解我的缓存大小。我的缓存全部基于Ehache在运行时Ehcache缓存大小
什么是在运行时查看单个缓存大小的最佳方式。使用JMX或API
是否有任何选项通过对CacheManager的plain-old-java调用进行配置,或者(必须忽略JMX)必须将XML配置构建成一个大字符串?
我正在生产中运行一个大型虚拟机,并且希望在运行时更多地了解我的缓存大小。我的缓存全部基于Ehache在运行时Ehcache缓存大小
什么是在运行时查看单个缓存大小的最佳方式。使用JMX或API
是否有任何选项通过对CacheManager的plain-old-java调用进行配置,或者(必须忽略JMX)必须将XML配置构建成一个大字符串?
是的,使用Ehcache,您可以配置缓存并仅通过Java代码(无XML配置)检索其大小。整合一切的确切方式取决于您的具体架构;我将假设泽西做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代码完成。更新您的吉斯模块,注册您的cacheManager
到系统MBeanServer
:
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true);
现在你可以将JConsole与您的Java程序,并找到在MBean net.sf.ehcache.CacheStatistics
缓存的统计信息。
JMX绝对是一个可行的解决方案。 EhCache文档专门为此提供了一个page。
Here's an example通过JMX配置EhCache。链接的文章包含Spring配置,但如果您不使用Spring,则它很容易转换为本机Java。
如何通过缓存获取堆用量?从上面的例子 - 8个对象在堆上占用多少个字节?我们有多个ehcache实例,我正在寻找一个解决方案,它提供了缓存的堆使用情况。 –
看起来从版本2.6开始的ehcache提供了一种使用maxBytesOnLocalHeap()配置缓存的方法。计算堆使用情况会很方便 - http://ehcache.org/documentation/2。6/configuration/cache-size#local-hello –
看来Ehcache不再提供getObjectCount()。有其他选择吗? – markthegrea