我正在生產中運行一個大型虛擬機,並且希望在運行時更多地瞭解我的緩存大小。我的緩存全部基於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