AI工具人
提示词工程师

Ehcache食用指南

  最近我们有个服务的时延(Latency)略微上涨,gc时间上涨了一倍,dump出java堆(Heap)之后用Mat分析发现,有份cache数据占据了20%+的堆内存,拥有上千万个小对象。然而这部分数据只是部分逻辑会用到,所以它占据这么大的堆内空间显得有些不值,并且会影响到gc进而影响到服务的时延。

   当然也有一些其他数据也占用比较多的堆内空间,但做优化总是先拿大头开刀。 当然把这份数据去掉是不可能了,因为上面还承载着几个比较重要的业务逻辑。既然数据放到java 堆内影响gc,是否可以放到堆外?答案是肯定的,这也是我写这篇博客的目的。就是用Ehcahe把数据移动到堆外,ehcahe甚至可以把数据放到磁盘、放到远端服务器。

如何使用

  首先是导入ehcache包,如果你用maven等包管理工具就很简单了,否则你就得手动下载jar,然后导入到你的项目里 。
  ehcache的使用也很简单,大概可以分为4步骤,和把大象关进冰箱一样简单。
  1. 创建cache manager
  2. 创建cache
  3. 使用
  4. 关闭cache

// 第一步 
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() 
    .withCache("preConfigured",
        CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) 
    .build(); 
cacheManager.init(); 
//第二步
Cache<Long, String> preConfigured =
    cacheManager.getCache("preConfigured", Long.class, String.class); 

Cache<Long, String> myCache = cacheManager.createCache("myCache", 
    CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)));
//第三步
myCache.put(1L, "da one!"); 
String value = myCache.get(1L); 

cacheManager.removeCache("preConfigured"); 

//第四步  
cacheManager.close(); 

  上文代码中,build cacheManager时也同时创建了一个名为 "preConfigured"的cache,也可以在cacheManager创建完后再创建cache,比如后面的“myCache"。之后使用就如同使用普通的map一样。 但非常关键的一点,如果cache不再用了,要记得删掉,cacheManager也要及得及时close掉,否则容易导致内存泄露,为什么之后会说到。

  在createCache时,需要指定3个参数,分别是cache里key value的class,和一份存储配置ResourcePools。 这是因为ehcache支持多级存储(这也是它最大的特性),你可以配置部分数据优先存储在堆内,存不下就存堆外,再存不下可以存在磁盘。 所以它需要知道key和value的class,用来对K-V做序列化和反序列化,方便多层级之间数据传输。
  因为存在对象的序列化和反序列化,你就不得不考虑下性能问题,因为序列化和反序列化都是需要时间的。但所幸的是有个局部性法则让你不用太多担心。ehcache里默认cache策略是LRU,它优先把数据优先存堆(heap)里的,内存中存不下以及被LUR淘汰下来的数据会被ehcache序列化后存入堆外或者磁盘。LRU策略会逐步把低频使用的数据往下层存储淘汰,从而保证高频数据尽可能都在上层存储中。
  像上面ehcahe这种多层级的设计,可以再尽可能少的影响性能的情况下减少堆内内存的使用,也可以减少内存的使用。 但有个可能的风险点,java语言本身其实是不太希望用户使用堆外的空间的,因为堆外空间脱离的JVM的控制,JVM无法对其做GC,可能会有内存泄露的风险。ehcache不得不让用户去考虑内存空间释放的问题,虽然很简单调用下removeCahce()和close()就行,但依旧有内存泄露的风险。

赞(0) 打赏
未经允许不得转载:XINDOO » Ehcache食用指南
描述文字

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫