2012-11-05 27 views
6

Używam dużej maszyny wirtualnej w produkcji i chciałbym dowiedzieć się więcej o moim rozmiarze pamięci podręcznej w czasie wykonywania. Moje pamięci podręczne są oparte na ehacheRozmiar pamięci podręcznej Ehcache w czasie wykonywania

Jaki jest najlepszy sposób, aby zobaczyć rozmiar poszczególnych pamięci podręcznych w czasie wykonywania. Zarówno przy użyciu JMX lub API

Czy jest jakaś opcja do skonfigurowania przez zwykłe stare połączenia java do CacheManager, lub (ignorując JMX na razie) musi jeden zbudować błąd konfiguracji XML w dużym ciągu?

Odpowiedz

10

Tak, za pomocą Ehcache można skonfigurować pamięć podręczną i pobrać ich rozmiary tylko za pomocą kodu Java (bez konfiguracji XML). Dokładny sposób integracji wszystkiego zależy od Twojej specyficznej architektury; Zamierzam przypuszczać, że Jersey robi rzeczy związane z API i Guice na zastrzyk uzależnienia.

definiowania cache

Dodać menedżer pamięci podręcznej dostępne poprzez wstrzyknięcie zależności. Można to zrobić za pośrednictwem modułu 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; 
} 

Zauważ, że statystyka jest włączony mycache.

Ponownie, korzystanie z pamięci podręcznej można wykonać w całości w kodzie Java, ale zależy to od architektury i projektu. Zazwyczaj robię to za pomocą przechwytywania metod (poprzez AOP), ale to już inny temat.

Fetch statystyk cache poprzez REST API

Biorąc pod uwagę Twój CacheManager jest dostępny poprzez wstrzyknięcie zależności można następnie podłączyć go do punktu końcowego REST i umożliwić dostęp do statystyk cache:

@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(); 
    } 
} 

teraz ty może pobierać informacje o swoich skrytek przez wywołanie REST:

GET /stats 

HTTP/1.1 200 OK 
Content-Type: text/plain; charset=utf-8 

mycache: 8 objects, 59 hits, 12 misses 

A co z JMX?

Ehcache ułatwia zarejestrowanie menedżera pamięci podręcznej za pomocą serwera MBean. Można to zrobić w kodzie Java. Zaktualizować moduł Guice, Rejestrowanie cacheManager do systemu MBeanServer:

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

Teraz można dołączyć JConsole do procesu Java i znaleźć swoje statystyki cache w MBean net.sf.ehcache.CacheStatistics.

+0

Jak uzyskać użycie sterty przez pamięć podręczną? Z powyższego przykładu - ile bajtów zajmuje 8 obiektów na stercie? Mamy wiele instancji ehcache i szukam rozwiązania, które daje wykorzystanie sterty pamięci podręcznej. –

+0

Wygląda na to, że ehcache począwszy od wersji 2.6 zapewnia sposób konfiguracji pamięci podręcznej za pomocą maxBytesOnLocalHeap(). Byłby przydatny do obliczenia użycia sterty - http://ehcache.org/documentation/2.6/configuration/cache-size # local-heap –

+0

Wygląda na to, że Ehcache nie dostarcza już getObjectCount(). Czy istnieje alternatywa? – markthegrea

0

JMX jest zdecydowanie realnym rozwiązaniem. Dokument EhCache ma numer page specjalnie do tego celu.

Here's an example konfiguracji EhCache przez JMX. Połączony artykuł zawiera konfigurację Spring, ale można go łatwo przetłumaczyć na natywną Javę, jeśli nie używasz Spring.

Powiązane problemy