前段时间在项目中使用ehcache做缓存,由于数据量比较大我想调大diskSpoolBufferSizeMB来提高ehcache的存储速度,结果调大到2GB以上,ehcache的放入速度变得异常缓慢,在网上找了好久也没找到原因,今天终于找到原因所在。由于diskSpoolBufferSizeMB在内部实际是以字节为单位,2GB已经超过正整数表示的范围,导致diskSpoolBufferSizeMB为负数,在put时ehcache误以为磁盘缓存队列已满,每次都执行暂停50ms,。
在DiskStorageFactory类
// 计算队列大小 spoolBufferSize*1024*1024 注意这里没有做正整数溢出判断 this.queueCapacity = cache.getCacheConfiguration().getDiskSpoolBufferSizeMB() * MEGABYTE; // 判断缓存是否已满 public boolean bufferFull() { // 如果发生正整数溢出,则这里总是返回true,也就误报缓存已满 return (diskQueue.size() * elementSize) > queueCapacity; }
在Cache里有判断磁盘缓存已满,如果满则休眠一小段时间默认是50毫秒再执行,减慢生产线程放入的速度
/** * wait outside of synchronized block so as not to block readers * If the disk store spool is full wait a short time to give it a chance to * catch up. * todo maybe provide a warning if this is continually happening or monitor via JMX */ private void backOffIfDiskSpoolFull() { if (compoundStore.bufferFull()) { // 调用的是DiskStorageFactory的bufferFull方法 // back off to avoid OutOfMemoryError try { Thread.sleep(BACK_OFF_TIME_MILLIS); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }
在Cache类里每个put方法都会去调用backOffIfDiskSpoolFull方法,内部的一个put方法的代码为
private void putInternal(Element element, boolean doNotNotifyCacheReplicators, boolean useCacheWriter) { // 。。。。。 applyDefaultsToElementWithoutLifespanSet(element); backOffIfDiskSpoolFull(); // 执行是否暂停 element.updateUpdateStatistics(); // 。。。。。 }
这可能是Ehcache开发人员疏漏的整数溢出检查,diskSpoolBufferSizeMB配置超过2GB,queueCapacity为负数,每次元素放入都会暂停50ms,导致速度异常缓慢。一般情况默认值就可以满足需求不需要调整diskSpoolBufferSizeMB的大小。
diskSpoolBufferSizeMB官方稳定的解释。
diskSpoolBufferSizeMB:
This is the size to allocate the DiskStore for a spool buffer. Writes are made
to this area and then asynchronously written to disk. The default size is 30MB.
Each spool buffer is used only by its cache. If you get OutOfMemory errors consider
lowering this value. To improve DiskStore performance consider increasing it. Trace level
logging in the DiskStore will show if put back ups are occurring.
相关推荐
Ehcache是一个开源的Java缓存库,常用于提高应用程序的性能和响应速度,通过将常用数据存储在内存中,避免频繁地从数据库或其他慢速存储中读取。在本案例中,我们将深入探讨如何利用Ehcache 2.6版本来实现数据缓存。...
m3u解析器 知识汇总:::: 其他 GIT地址 UI资源 , 限流算法参考 安卓 基于改造升级打怪 iosched 格子 模块说明 按照创建顺序(不是按照显示顺序)说明如下 项目模块 项目说明 学习弹簧靴 弹簧靴学习笔记 ...
EHCAHCE基于JGROUP的集群配置方案,内含相关配置文件,及配置说明
项目简介:此项目只是简单的集成spring+springmvc+shiro+ehcahce 二: 步骤说明: 1:项目集成spring 在web.xml中配置spring容器的监听器。 2:项目集成springmvc 在web.xml中配置前端控制器 3:项目集成...
6. 能够对压缩结果进行cache处理,支持内存cache, ehcahce等多种cache算法,也可以根据需要自定义cache算法. 有个类似的东西packtag ,因为packtag 需要使用他提供的taglib,所以决定开发E3.Resource ,packtag 主页...
elastic-demo-java ...缓存策略:elastic-mapper文件及字典类型数据全部缓存到本地磁盘,具体路径在当前项目ehcahce文件中。 当接受到数据进行转换时,从缓存中读取对应的数据,如果在缓存中找不到相
ehcache的依赖包,使用ehcache缓存机制必备
阿里云java sdk源码 88ybg 网站 源码开源 正式地址 ybg1.8.2 已经停止框架 ybg2.0 已经停止框架开发 ,停止框架(报表填报业务) 地址 ybg3.0 基于springboot2开发 ...Ehcahce 缓存,减少数据库压力quartz
阿里云java sdk源码 88ybg 网站 源码开源 正式地址 ybg1.8.2 已经停止框架 ybg2.0 已经停止框架开发 ,停止框架(报表填报业务) 地址 ybg3.0 基于springboot2开发 ...Ehcahce 缓存,减少数据库压力quartz
阿里云java sdk源码 88ybg 网站 源码开源 正式地址 ybg1.8.2 已经停止框架 ybg2.0 已经停止框架开发 ,停止框架(报表填报业务) 地址 ybg3.0 基于springboot2开发 ...Ehcahce 缓存,减少数据库压力quartz
做ehcache分布式缓存用的! ehcache-2.6.6.jar和terracotta-toolkit-1.6-runtime-5.5.0.jar 主要是给自己写的博客中做一个下载资源链接!