我正在使用带有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>
答案 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