转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511
问题目录:
- 一、Ehcache、BigMemory Go和BigMemory Max的关系
- 二、copyOnRead配置分析
- 三、BigMemory的sizeOf问题:
- 四、timeToLive和timeToIdle配置分析
- 五、Ehcache的统计配置和说明:
- 六、Ehcache的常用的eviction算法:
- 七、MaxEntries和MaxBytes配置选择问题:
- 八、哪些配置参数可以运行时动态修改
- 九、Ehcache批量操作优化:
- 十、是否要使用磁盘
- 十一、Element生命周期
- 十二、序列化问题
一、Ehcache、BigMemory Go和BigMemory Max的关系
(1) terracotta收购了Ehcache,在Ehcache基础上开发了商业版的BigMemory Go(单机版:有试用期)和BigMemory Max(集群版:收费)。
(2) BigMemory支持使用堆外内存,有效利用本机内存并有效防止GC。
(3) Ehcache和BigMemory的API几乎完全一致。
二、 copyOnRead配置分析:
1. Ehcache进行cache.get()操作时,内存模型示意图
2. copyOnRead配置的几点说明:
(1) copyOnRead=false是默认值
(2) copyOnRead=false的话,当调用cache.get(key)时,引用的(o1-o4)都是同一个对象,
也就是说,如果有其他线程对该Element其进行update时,o1-o4也会使用新的value。
(3) copyOnRead=true的话,可以看右边的示意图,很明显(o1-o4)引用是copy的新对象(每个一份新的copy)。
也就是说,如果有其他线程对该Element其进行update时,o1-o4仍然会使用老value。
(4) 优缺点:
copyOnRead=false | 节省空间 | 线程不安全 |
copyOnRead=true | 线程安全 | 浪费空间 |
3. copyOnRead测试实验:
(0) cache.put()一个element, 然后循环get,观察在copyOnRead=false|true时,cache.get(key)打印值
package com.sohu.tv.ehcache.config; import net.sf.ehcache.Element; import org.junit.Test; import com.sohu.tv.ehcache.base.BaseTest; /** * ehcache中copyOnRead测试 * * @author leifu * @Date 2015-8-16 * @Time 下午9:02:56 */ public class EhcacheCopyOnReadTest extends BaseTest { @Test public void testCopyOnRead() throws InterruptedException { //写 String key = "bigKey"; byte[] bytes = new byte[1024 * 1024]; Element element = new Element(key, bytes); cache.put(element); //循环get for (int i = 0; i < 10; i++) { logger.info(cache.get(key).toString()); } } }
(1) 当copyOnRead=false:为同一个value
(2) 当copyOnRead=true,为不同value
设置jvm运行参数:-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
package com.sohu.tv.ehcache.config; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import net.sf.ehcache.Element; import org.junit.Test; import com.sohu.tv.ehcache.base.BaseTest; /** * ehcache中copyOnRead测试 * vm:-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError * * @author leifu * @Date 2015-8-16 * @Time 下午9:02:56 */ public class EhcacheCopyOnReadTest extends BaseTest { @Test public void testCopyOnReadHeap() throws InterruptedException { String key = "bigKey"; byte[] bytes = new byte[1024 * 1024]; Element element = new Element(key, bytes); cache.put(element); List<byte[]> list = new ArrayList<byte[]>(); for (int i = 0; i < 10; i++) { Element e = cache.get(key); byte[] aa = (byte[]) e.getObjectValue(); list.add(aa); } } }
运行会报错,发生了Java heap space,进一步证明了copyOnRead=true时获取的是复制品。
4. copyOnRead生产环境的选择:
选择依据业务的需要,根据第二节中copyOnRead的配置说明,来进行选择。
三、BigMemory的sizeOf问题:(具体参考BigMemroy系列文章--11. BigMemory中的SizeOf问题)
几点总结:
(1) Bigmemory的主要开销:序列化+sizeOf计算
(2)对sizeOf引擎友好的对象:尽量使用不深/不广的对象:深(继承树) 广( bigPojo,ArrayList,HashMap等)
(3)采用预前序列化的方式,bigMemory只存序列化后的byte数组, 就不会出现sizeof问题
四、timeToLive和timeToIdle配置分析:
1. 先看下官方文档的解释:
timeToLive – The maximum number of seconds an element can exist in the cache regardless of access.
The element expires at this limit and will no longer be returned from the cache. The default value is 0, which means no TTL eviction takes place (infinite lifetime).
timeToIdle – The maximum number of seconds an element can exist in the cache without being accessed.
The element expires at this limit and will no longer be returned from the cache. The default value is 0, which means no TTI eviction takes place (infinite lifetime).
2. timeToLive和timeToIdle理解
英语不太好,上面除了红色的不一样,解释是一样的,一开始没理解这个配置的意思,通过测试终于明白了。
timeToLive(TTL): 可以理解成过期时间,不管key是否在过期时间内被访问了,到了过期时间就从cache中移除(get()不到了,实际通过测试发现没有立即删除,应该是ehcache有一些过期删除策略)
timeToIdle(TTI): 可以理解成最大闲置时间,如果key在此期间被访问,那么TTI将恢复原值。
两者比较:TTL是到点一定过期,TTI是到点不一定过期(期间被访问了)
3. timeToLive和timeToIdle测试实验
(1) timeToLive:
(a) 配置新加timeToLiveSeconds="10"
<?xml version="1.0" encoding="UTF-8" ?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <cache name="firstEhcache" maxElementsInMemory="10000" timeToLiveSeconds="10"> </cache> </ehcache>
(b)测试代码
package com.sohu.tv.ehcache.ttl; import java.util.concurrent.TimeUnit; import net.sf.ehcache.Element; import org.junit.Test; import com.sohu.tv.ehcache.base.BaseTest; /** * 测试timeToLive配置 * @author leifu * @Date 2015-8-17 * @Time 下午8:12:10 */ public class EhcacheTimeToLiveTest extends BaseTest { @Test public void testTimeToLive() throws InterruptedException { // put一个Element,ehcache.xml设置 timeToLiveSeconds="10" String key = "ttlKey"; byte[] bytes = new byte[1024]; Element element = new Element(key, bytes); cache.put(element); logger.info("after put, ehcache object size: " + cache.getSize()); // 等待10秒过期 for (int i = 10; i > 0; i--) { Element e = cache.get(key); long remainSecondsToExpire = 0; try { remainSecondsToExpire = (e.getExpirationTime() - System.currentTimeMillis()) / 1000; } catch (Exception exception) { } logger.info("key {} remain {} seconds to expire", key, remainSecondsToExpire); TimeUnit.SECONDS.sleep(1); } // 过期后再次获取 Element e = cache.get(key); logger.info("exceed ttl get element is {}", e); logger.info("At final, ehcache object size: " + cache.getSize()); } }
(c) 输出:
14:12:40.066 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - after put, ehcache object size: 1
14:12:40.067 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 9 seconds to expire
14:12:41.067 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 8 seconds to expire
14:12:42.068 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 7 seconds to expire
14:12:43.070 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 6 seconds to expire
14:12:44.070 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 5 seconds to expire
14:12:45.070 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 4 seconds to expire
14:12:46.070 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 3 seconds to expire
14:12:47.071 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 2 seconds to expire
14:12:48.071 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 1 seconds to expire
14:12:49.071 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - key ttlKey remain 0 seconds to expire
14:12:50.072 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - exceed ttl get element is null
14:12:50.072 [main] INFO c.s.t.e.ttl.EhcacheTimeToLiveTest - At final, ehcache object size: 0
(2) timeToIdle:
(a) 新加配置timeToIdleSeconds="10"
<?xml version="1.0" encoding="UTF-8" ?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <cache name="firstEhcache" maxElementsInMemory="10000" timeToIdleSeconds="10"> </cache> </ehcache>
(b) 测试代码
package com.sohu.tv.ehcache.ttl; import java.util.concurrent.TimeUnit; import net.sf.ehcache.Element; import org.junit.Test; import com.sohu.tv.ehcache.base.BaseTest; /** * ehcache TimeToIdle测试 * * @author leifu * @Date 2015-8-17 * @Time 下午8:12:10 */ public class EhcacheTimeToIdleTest extends BaseTest { @Test public void testTimeToIdle() throws InterruptedException { // put一个Element,ehcache.xml设置 timeToIdleSeconds="10" String key = "ttiKey"; byte[] bytes = new byte[1024]; Element element = new Element(key, bytes); cache.put(element); logger.info("after put, ehcache object size: " + cache.getSize()); Element e = null; // 等待10秒过期 for (int i = 10; i > 0; i--) { logger.info("sleep {} seconds wait expire", i); if (i == 2) { logger.info("ehcache get key {}", key); e = cache.get(key); } TimeUnit.SECONDS.sleep(1); } logger.info("element is {}", e); long remainSecondsToExpire = (e.getExpirationTime() - System.currentTimeMillis()) / 1000; // 推测还有8秒(10-2)过期 logger.info("key {} remain {} seconds to expire", key, remainSecondsToExpire); // 再次get,重置过期时间 e = cache.get(key); remainSecondsToExpire = (e.getExpirationTime() - System.currentTimeMillis()) / 1000; // 推测重置成10秒过期 logger.info("key {} remain {} seconds to expire", key, remainSecondsToExpire); logger.info("At final, ehcache object size: " + cache.getSize()); } }
相关推荐
赠送jar包:ehcache-3.9.9.jar; 赠送原API文档:ehcache-3.9.9-javadoc.jar; 赠送源代码:ehcache-3.9.9-sources.jar; 赠送Maven依赖信息文件:ehcache-3.9.9.pom; 包含翻译后的API文档:ehcache-3.9.9-javadoc-...
hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar hibernate-search-4.2.0.Final.jar hibernate-search-analyzers-4.2.0.Final.jar hibernate-...
赠送jar包:ehcache-core-2.6.11.jar; 赠送原API文档:ehcache-core-2.6.11-javadoc.jar; 赠送源代码:ehcache-core-2.6.11-sources.jar; 赠送Maven依赖信息文件:ehcache-core-2.6.11.pom; 包含翻译后的API文档...
Ehcache 2.x系列是其历史上的一个稳定版本,支持多种缓存策略,包括LRU(Least Recently Used)和LFU(Least Frequently Used)等,用于自动清理不常访问的数据。此外,Ehcache支持分布式缓存,可以在多台服务器之间...
该包是hibernate中所用的一个包,专门用来去处理特定的问题,它是和ehcache一起用的一个包
Ehcache 2.10.8是该产品的特定版本,它包含了针对缓存管理和优化的一系列特性和改进。在bigmemory-max-4.3.8.4.2.tar.gz这个压缩包中,我们可以找到与Ehcache 2.10.8相关的所有组件和配置文件。 1. Ehcache的核心...
ehcache缓存jar(ehcache-core-2.4.6.jar+ehcache-web-2.0.4.jar)
mybatis-ehcache-1.0.2.jar META-INF/LICENSE META-INF/MANIFEST.MF META-INF/NOTICE META-INF/maven/org.mybatis.caches/mybatis-ehcache/pom.properties META-INF/maven/org.mybatis.caches/mybatis-ehcache/pom....
ehcache-core-2.6.10.jar依赖包 MyBatiesEhCache二级缓存 Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个...
jar包,官方版本,自测可用
在XML Schema设计中,"cvc-complex-type.2.4.d: Invalid content was found" 是一个常见的错误信息,这通常意味着在解析XML文档时,遇到了不符合定义的复杂类型的内容。这个错误通常涉及到XML Schema的约束规则,即...
hibernate-ehcache-4.1.0.Final.jar 是hibernate4.1使用缓存的jar包
"ehcache-core-2.4.5.jar"是Ehcache的核心库,该版本为2.4.5,包含Ehcache的基本功能和API。在使用这个版本的Ehcache时,需要额外引入两个SLF4J(Simple Logging Facade for Java)的依赖,分别是"slf4j-api-1.6.1....
ehcache-core-2.6.10.jar专用包,欢迎下载 ehcache-core-2.6.10.jar ehcache-core-2.6.10.jar ehcache-core-2.6.10.jarehcache-core-2.6.10.jarehcache-core-2.6.10.jar
标题"ehcache-2.7.3-distribution.tar.gz"表明这是一个包含EHCache 2.7.3版本的发行版压缩包,格式为tar.gz,这是一种常见的Linux/Unix系统中用于打包和压缩文件的格式。这个版本的EHCache是Java缓存系统的一个版本...
首先,我们来看"ehcache-1.6.2-distribution.tar.gz"。这个压缩包包含了Ehcache的1.6.2版本,它是一个重要的里程碑,因为每个版本的更新都会带来新的功能和改进。1.6.2版可能包括了增强的性能、错误修复以及对当时...
hibernate-ehcache-3.3.2.GA.jar
cas-client-support-distributed-ehcache-3.2.0.jar
ehcache-core-2.5.2.jar ehcache-spring-annotations-1.2.0.jar guava-13.0.1.jar ehcache-terracotta-2.5.2.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar terracotta-toolkit-1.5-runtime-4.2.0.jar
- 使用二级缓存提高性能,如EhCache集成。 - 合理设计实体关系,避免N+1查询问题。 - 使用批处理更新和插入,减少数据库交互次数。 通过以上分析,我们可以看出`hibernate-core-5.0.11.Final.jar`在ORM中的重要地位...