我怎么弄清楚ehcache使用了多少内存?

时间:2016-12-15 17:23:22

标签: java hibernate memory jboss ehcache

我正在使用带有Java 6的JBoss 7.1.3.AS和此版本的ehcache

            <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-ehcache</artifactId>
                    <version>5.1.0.Final</version>
            </dependency>

我们在Amazon Linux上运行。如何确定我的ehcache使用了多少内存?我可以看到JBOss与top ...使用的统计数据......

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND   
12159 jboss     20   0 14.9g 5.7g  25m S 163.2 19.3 225:18.15 java

我们的系统有多少可用内存...

[dalvarado@east1c ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:         30104       8099      22004          0        161       1859
-/+ buffers/cache:       6078      24026
Swap:            0          0          0

但是我有兴趣弄清楚我们的ehcache具体使用多少内存,以便我们可以调整默认缓存中的条目数。请注意,因为我们处于生产环境中,所以添加新的Java代码不是一个直接的选择。以下是ehcache配置......

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false">

<!-- This is a default configuration for 256Mb of cached data using the JVM's heap, but it must be adjusted
     according to specific requirement and heap sizes -->
<defaultCache maxElementsInMemory="200000"
     eternal="false"
     timeToIdleSeconds="86400"
     timeToLiveSeconds="86400"
     overflowToDisk="false"
     memoryStoreEvictionPolicy="LRU">
</defaultCache> 
<cache name="main" maxElementsInMemory="200000" />

 <cacheManagerPeerProviderFactory
     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
     properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
     multicastGroupPort=4446, timeToLive=32"/>

<cacheManagerPeerListenerFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
    properties="hostName=localhost, port=40001,
    socketTimeoutMillis=2000"/>    

</ehcache>

2 个答案:

答案 0 :(得分:1)

如果允许您对正在运行的java应用程序进行堆转储,请使用内存分析器进行分析,例如使用MAT http://www.eclipse.org/mat/

要进行堆转储,您可以使用jmap。识别java进程的pid,例如使用

ps aux |grep java

然后

jmap -dump:format=b,file=heap_dump.hprof <pid>

使用MAT打开文件heap_dump.hprof

Memory Analyzer提供了对象图的支配树,因此您可以选择ehcache缓存对象作为根,并详细查看子缓存对象。

答案 1 :(得分:0)

EhCache为此提供了net.sf.ehcache.management.sampled.Sampled Cache。将其注册到JMX。除其他外,它公开了已注册缓存使用的堆字节数。

创建它很容易,它只包装现有的缓存:

SampledCache sampledCache = new SampledCache(cache);

它公开的数据量非常有用:API