- 浏览: 259301 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
qingtingchen:
请问下如果只有uid/emial 和密码的话要怎样进行认证
【总结】Spring LDAP整理 -
cylboke:
太给力了,搞了一下午,一直换jar版本,不起作用,用楼主的方法 ...
【学习】spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX) -
hu3625067:
楼主写的很精辟,言简意赅,非常实用
【总结】Spring LDAP整理 -
hu3625067:
写的很精辟,很实用
【总结】Quartz整理 -
Mr小血:
找了好久,终于找到解决办法了,谢谢
formvalidator4.1.3 - 校验时不能自定义向后台传值的BUG问题
原文地址: http://www.ehcache.org/documentation/2.8/configuration/cache-size
文章性质: 官方文档
注: 阅读本文需要一定的Ehcache的基础。本文主要是针对缓存的大小这方面进行详述,并不是入门示例。有时间我会翻译Ehcache的所有官方文档。若转载请注明本文地址。
--------------
目录
1. 简介
2. 设置缓存大小
3. CacheManager级别、Cache级别
3.1 堆内存 (Local Heap)
3.2 大空间内存(堆外内存 Local Off-Heap)
3.3 本地磁盘(Local Disk)
4. 缓存大小的一些例子
4.1 统一配置
4.2 明确Cache大小
4.3 混合配置
4.4 使用百分比
4.5 只配置Cache级别
4.6 溢出 (Overflows)
5. 分布式缓存大小
6. 建立计算缓存大小机制
6.1 忽略计算大小
6.2 限制遍历对象的配置
--------------
1. 简介
本篇文章我们来说说如何正确的限制Ehcache的大小,Ehcache提供了一系列的方法通过cache-configuration来设置不同的数据。这些限制大小的属性通过设置不同的节点信息来影响服务器内存和磁盘。
2. 设置缓存大小
下面这张表总结了缓存大小的属性:
以上这些属性在设定值时用的都是整数数字,单位可以是K,M,G,(比如500K,200M,2G等),也可以使用百分符号(比如20%),在使用百分符号时,必须先指定CacheManager级别。
下面的图形结构说明了缓存在每个存储器的属性设制:
3. CacheManager级别、Cache级别
你可以通过配置来限制缓存在各个存储器的大小。你也可以在CacheManager级别上对它下属的所有缓存进行统一限制。
如果在CacheManager级别没有配置,那么也可以在单个的cache配置相应的属性。如果在CacheManager级别有配置,那么单个的cache就可以共享那个配置。(当Cache自己有配置该属性时,以自己配置的为先)。
例如,CacheManager有8个缓存节点,如我们在CacheManager级别限制了堆内存的最大使用数maxBytesLocalHeap为1G,,另外在两个单个cache节点分别配置了200M的内存,剩下的6个节点没有单独配置大小,那么这意味着剩下的6个cache共享剩余的624M。值得注意的是cache级别的配置必须用比特级别(bytes-based)的属性来配置,而不能便用实体级别(entries-based)的属性(例如maxEntriesLocal)。
在程序启动时,都会检查CacheManager级别的配置是否过度分配了。如有任何一个配置过度分配了,那么就会抛错InvalidConfigurationException。比如在一个总配置中,我们给其中一个Cache配置maxBytesLocalHeap=30%,那么所有的Cache的配置总和不能超过100%,否则就会报错。
如果在Cache级别指定了任何的一种缓存类别正好等于CacheManager级别定义给所有的Cache的大小,那么就会打印出警告。也就是说,单个Cache的配置不能和CacheManager级别的定义相等,因为这样就没有留给其它节点的定义空间了。
3.1 堆内存 (Local Heap)
使用堆内存的大小是必须设置的,可以是定义在CacheManager级别的(只能设定maxBytesLocalHeap),或者是定义在单个有Cache上的(maxBytesLocalHeap或者maxEntriesLocalHeap)。如果不定义堆内存的大小会导致程序抛错:InvalidConfigurationException
在一个配置文件中,我们可以结合CacheManager级别和单个Cache级别来分配大小,比如我们在CacheManager级别定义了属性maxBytesLocalHeap的总大小,然后对单个Cache进行maxBytesLocalHeap大小的分配(可以是百分比,也可以是具体的值)。
在任何情况下,每个缓存都必须有堆内存的配置,不管是单独配置在每个Cache节点上还是统一定义在CacheManager级别上。
3.2 大空间内存(堆外内存 Local Off-Heap)
堆外内存只有在BigMemory Go(企业版Ehcache)下才有效。堆外内存的配置只能用比特-类别的(bypes),而不能用实体-类别的(entries)。
如果CacheManager级别定义了堆外内存的配置,那么你的应用就不能动态的增加缓存配置——否则就会报错。如果程序运行过程中删除了任何一个缓存,另外的缓存就不能再定义那些未使用的堆内存部分的大小。所以说为了分配所有的堆内存的大小,那么就要从Ehcache的配置中删除那些不想要的Cache,然后重新加载配置。
要使用堆外内存,单个Cache的overflowToOffHeap属性必须是”true”。如果在CacheManager级别定义了堆外内存,那么就会自动的把所有的Cache节点的overflowToOffHeap属性改为“true”。在这种情况下,你可以在单个Cache下重写overflowToOffHeap的值为“false”,这样就不会被CacheManager统一改掉了。
3.3 本地磁盘(Local Disk)
缓存可以被写入本地磁盘,注意点:
• 隐式缓存(Distributed)不能被写入本地磁盘。
• 缓存的persistenceStrategy属性必须设定为"localTempSwap"。
• 本地磁盘是最慢的缓存类别模式。
4. 缓存大小的一些例子
以下演示了统一配置和单个Cache配置。
4.1 统一配置
CacheManager级别的统一配置:
名叫CM1的CacheManager自动的给每个缓存(Cache1,Cache2,Cache3)分配属性大小值。每个缓存都会得到三分之一的堆内存(maxBytesLocalHeap="100M"),堆外内存(maxBytesLocalOffHeap="10G")以及本地内存(maxBytesLocalDisk="50G")。
注,在CacheManager级别只能分配比特-类型(bytes)相关的属性。
4.2 明确Cache大小
你也可以明确的每个缓存分配大小:
以上的例子中,Cache1分配获得了50M的堆内存;其它缓存(Cache2\Cache3)再平均分配剩余的堆内存空间(100M-50M=50M)。Cache2的堆外内存配置是5G,那么其它的缓存再平均分配剩余的堆外内存空间(10G-5G=5G)。所以虽然Cache3没有单独配置,根据头部公用配置(也就是CacheManager级别),我们可以得知,Cache3的堆内存是25M,堆外内存为2.5G以及本地磁盘大小是20Gb。
在缓存中配置了某个属性,获得了一部分的公用配置的大小,但并不意味着就必须要使用。比如Cache1配置了50M的堆内存,那么就可以使用50Mb中的任何大小。
值得注意的是缓存配置必须使用相同的属性来创建一个公用的配置(pool)。比如Cache1就不能再使用属性maxEntriesLocalHeap来从公用配置中获得堆内存(节点-类型)的大小(因为公用头部配置的是属性maxBytesLocalHeap)。
4.3 混合配置
如果一个CacheManager没有配置某一属性,单个节点的Cache仍然能够单独配置,具体示例如下:
名叫CM2的CacheManager创建了一个配置,堆内存大小为100M。它下面的所有缓存都将受这个配置的约束。单个Cache可以再配置其它自己的属性。例如Cache4配置了本地磁盘的最大值,Cache5配置了堆外内存空间,因为Cache6虽然没有Cache级别的配置,但因为CacheManager级别有配置堆内存,所以Cache6能获得(100M-50M)/2 = 25M的堆内存。
4.4 使用百分比
我们也可以使用百分比来配置,具体示例如下:
你可以使用百分比来配置属性maxBytesLocalHeap。如果在CacheManager级别配置了百分比,那么表示占总的JVM内存的百分之多少。如果是在Cache级别配置了百分比,那么表示它占它所属的CacheManager配置的百分之多少。
4.5 只配置Cache级别
本示例中,在CacheManager级别不配置,而只在Cache级别配置:
在不配置CacheManager级别时,缓存也可以单个独立配置。需要注意的是单个缓存的配置必须声明堆内存的配置,这是因为堆内存没有统一声明配置。总之,堆内存的配置是必须存在的,要么在CacheManager上统一配置,要么在Cache级别上单独配置。
4.6 溢出 (Overflows)
Caches that do not specify overflow will overflow if a pool is set for off-heap and disk.
如果配置了堆外内存和本地磁盘,当堆内存满后,会自动溢出到堆外内存和本地磁盘,若没有配置,则不会溢出:
5. 分布式缓存大小
分布式缓存在企业式Ehcache下有效,也可以按以上的例子进行配置,除了不能使用本地磁盘(换句话说不能使用*LocalDisk来配置)。分布式缓存可以使用堆内存Terracotta集群技术来(一款由美国Terracotta公司开发的著名开源Java集群平台)来存储资原(堆内存或磁盘)。
分布式缓存中,每个节点下可以为相同的缓存配置独立的属性。那意味着当相同的要素和属性被Ehcache配置所加载时,在同一个缓存下,这些配置在不同的节点上的属性都可以同时被多个节点所使用。
例如:一个缓存可能有以下这样的配置:
同样名叫myCache的缓存在另一个节点上可能有以下这样的配置:
如果一个缓存超出了节点所配置的最大值,那么Terracotta会提供给名为myCache的缓存一个不限制大小的磁盘空间来备份溢出数据。如果要做限制,可以使用属性maxEntriesInCache,其值可配值任意一个正数。
Terracotta将会回收myCache的超出属性maxEntriesInCache配置的部分。对于任何一个缓存,Terracotta回收机制都是基于那个最大的配置。除此之外,Terracotta不会回收已经存在于客户端的缓存节点,同样的新配置的属性maxEntriesInCache在已经生效于客户端的缓存也同样无效。
6. 建立计算缓存大小机制
Ehcache建立缓存大小机制的步骤分为计算数据元素的大小和按照CacheManager中的配置来强制限制其大小。
众所周知,JAVA是面向对象语言,那么类的属性可以是另一个对象。在每个元素在存入内存(或磁盘)时会被计算其大小,包括键值(Key)和元素值(Value)的大小,也包括这个类的属性引用其它类型的值的大小。这个可以看成是递归形式的计算。
这意味着一个被很多其它类引用的对象,在每次被引用的时候都会被计算。这个被引用的对象我们称之为“引用对象”,这会导致计算结果过份庞大。“引用对象”应该被忽略计算。
6.1 忽略计算大小
我们可以使用annotation标签@IgnoreSizeOf来标记为可以忽略计算“引用对象”。这个annotation标签可以是方法级别的,类级别的或是包级别的。也可以定义一个忽略名单的文件包含类名、方法名、包名。
@IgnoreSizeOf是不能被继承的,子类如果没有标记,那么当别的类引用它时,还是会计算其大小。
以下示例:忽略Dog.class
以下示例:忽略属性sharedInstance
以下示例:当在包com.pany.ignore package上加入标签@IgnoreSizeOf,那么在计算缓存大小时,会忽略整个包下的资源
我们也可以定义一个文件来声明要忽略的类和属性,这个文件需要用系统属性net.sf.ehcache.sizeof.filter来标明出处。
注:这些衡量方法和配置忽略大小的方法只针对堆内存有效。如果一个元素已经被存在了堆外内存或磁盘中,或企业级的Terracotta中,那么他们会被序列化成比特数组。这个计算就变的简单多了,我们只需要计算这些比特数据的大小,而不用在意引用关系等。
6.2 限制遍历对象的配置
综上所述,缓存的大小与引用的对象有关。我们可以使用annotations标签来标明是否需要计算。另一方面,CacheManager和cache级别都定义了其缓存的配置大小。
注:以下配置对分布式缓存无效。
6.2.1 CacheManager级别计算
以下配置表明,在CacheManager级别中,size-of引擎可以计算多少深度的堆内存的元素:(译者注:如果理解深度这个概念,介于JAVA都是引用型的对象,所以可以用树的深度来类比)
这个配置有以下两个属性:
• maxDepth – 表示size-of引擎可以目标对象可以访问其引用的对象的最大深度。若配置了sizeOfPolicy,那么该元素是必须要配置的。
• maxDepthExceededBehavior – 标明当超出最大深度(>maxDepth)时的措施:可以配置的值:continue/abort
"continue" - 默认配置。表示当计算的值超出最大深度时,会打印WARN级别的log,并且会继续执行(不会强制退出报错)。
"abort" - 当SizeOf引擎计算失败时,会打印WARN级别的log,并返回错误。在这个配置下,方法 Ehcache.hasAbortedSizeOf() 返回true。
该SizeOf的配置可以放在CacheManager级别的配置下(即<ehcache>),也可放在cache配置级别下(即<cache>或<defaultCache>),在cache级别下的配置优先级要高于CacheManager级别下的(即两者都有配置的话,以cache的为先)。
注:sizeOfPolicy对分布式缓存无效。
6.2.2 Cache级别计算
在Cache级别(<cache>)使用<sizeOfPolicy>来定义size-of引擎的计算规则时,如同上一段落所说的,优先级别比CacheManager级别要高。
6.2.3 调试Size-Of
当计算大小的过程中出现警告或错误时(通常是size-of引擎报错),可采取以下方法来获得更多的调试信息:
• 将系统属性(system property)=net.sf.ehcache.sizeof.verboseDebugLogging设成 true
• 若你的log是用SLF4J实现的,那么将LOG信息为DEBUG级别设为可见(即打印到控制台或文件)。
文章性质: 官方文档
注: 阅读本文需要一定的Ehcache的基础。本文主要是针对缓存的大小这方面进行详述,并不是入门示例。有时间我会翻译Ehcache的所有官方文档。若转载请注明本文地址。
--------------
目录
1. 简介
2. 设置缓存大小
3. CacheManager级别、Cache级别
3.1 堆内存 (Local Heap)
3.2 大空间内存(堆外内存 Local Off-Heap)
3.3 本地磁盘(Local Disk)
4. 缓存大小的一些例子
4.1 统一配置
4.2 明确Cache大小
4.3 混合配置
4.4 使用百分比
4.5 只配置Cache级别
4.6 溢出 (Overflows)
5. 分布式缓存大小
6. 建立计算缓存大小机制
6.1 忽略计算大小
6.2 限制遍历对象的配置
--------------
1. 简介
本篇文章我们来说说如何正确的限制Ehcache的大小,Ehcache提供了一系列的方法通过cache-configuration来设置不同的数据。这些限制大小的属性通过设置不同的节点信息来影响服务器内存和磁盘。
2. 设置缓存大小
下面这张表总结了缓存大小的属性:
存储器缓存类别 | 属性 | CacheManager级别是否可用 | 描述 |
Heap (堆内存) | maxEntriesLocalHeap \ maxBytesLocalHeap | 在CacheManager级别上,只能设定属性maxBytesLocalHeap | 用来限制缓存在堆内存中所能使用的最大的字节数。当我们在CacheManager级别设定了属性maxBytesLocalHeap时,在这个CacheManager下面的所有Cache都会生效,这个设定可以在每个Cache上设置,或者在CacheManager级别设定。 |
Off-heap (堆外内存) | maxBytesLocalOffHeap | 可以 | 堆外内存在BigMemory Go(企业版Ehcache)下有效。用来限制缓存在非堆内存的最大字节数。当我们CacheManager级别设定了属性maxBytesLocalOffHeap时,在这个CacheManager下面的所有Cache都会生效。 |
Local disk (本地磁盘) | maxEntriesLocalDisk \ maxBytesLocalDisk | 在CacheManager级别上,只能设定属性maxBytesLocalDisk | 用来限制缓存所能使用的磁盘的最大字节数。只有单机环境下才能便用本地磁盘。当在CacheManager级别设定了maxBytesLocalDisk属性时,在这个CacheManager下面的所有Cache都会生效。但并不包括隐式指定的Cache。(隐式Cache是指overflowToDisk=true的Cache)。另外:这些设定只用于临时将缓存写入磁盘。并不适用于持久化的写入磁盘。 |
以上这些属性在设定值时用的都是整数数字,单位可以是K,M,G,(比如500K,200M,2G等),也可以使用百分符号(比如20%),在使用百分符号时,必须先指定CacheManager级别。
下面的图形结构说明了缓存在每个存储器的属性设制:

3. CacheManager级别、Cache级别
你可以通过配置来限制缓存在各个存储器的大小。你也可以在CacheManager级别上对它下属的所有缓存进行统一限制。
如果在CacheManager级别没有配置,那么也可以在单个的cache配置相应的属性。如果在CacheManager级别有配置,那么单个的cache就可以共享那个配置。(当Cache自己有配置该属性时,以自己配置的为先)。
例如,CacheManager有8个缓存节点,如我们在CacheManager级别限制了堆内存的最大使用数maxBytesLocalHeap为1G,,另外在两个单个cache节点分别配置了200M的内存,剩下的6个节点没有单独配置大小,那么这意味着剩下的6个cache共享剩余的624M。值得注意的是cache级别的配置必须用比特级别(bytes-based)的属性来配置,而不能便用实体级别(entries-based)的属性(例如maxEntriesLocal)。
在程序启动时,都会检查CacheManager级别的配置是否过度分配了。如有任何一个配置过度分配了,那么就会抛错InvalidConfigurationException。比如在一个总配置中,我们给其中一个Cache配置maxBytesLocalHeap=30%,那么所有的Cache的配置总和不能超过100%,否则就会报错。
如果在Cache级别指定了任何的一种缓存类别正好等于CacheManager级别定义给所有的Cache的大小,那么就会打印出警告。也就是说,单个Cache的配置不能和CacheManager级别的定义相等,因为这样就没有留给其它节点的定义空间了。
3.1 堆内存 (Local Heap)
使用堆内存的大小是必须设置的,可以是定义在CacheManager级别的(只能设定maxBytesLocalHeap),或者是定义在单个有Cache上的(maxBytesLocalHeap或者maxEntriesLocalHeap)。如果不定义堆内存的大小会导致程序抛错:InvalidConfigurationException
在一个配置文件中,我们可以结合CacheManager级别和单个Cache级别来分配大小,比如我们在CacheManager级别定义了属性maxBytesLocalHeap的总大小,然后对单个Cache进行maxBytesLocalHeap大小的分配(可以是百分比,也可以是具体的值)。
在任何情况下,每个缓存都必须有堆内存的配置,不管是单独配置在每个Cache节点上还是统一定义在CacheManager级别上。
3.2 大空间内存(堆外内存 Local Off-Heap)
堆外内存只有在BigMemory Go(企业版Ehcache)下才有效。堆外内存的配置只能用比特-类别的(bypes),而不能用实体-类别的(entries)。
如果CacheManager级别定义了堆外内存的配置,那么你的应用就不能动态的增加缓存配置——否则就会报错。如果程序运行过程中删除了任何一个缓存,另外的缓存就不能再定义那些未使用的堆内存部分的大小。所以说为了分配所有的堆内存的大小,那么就要从Ehcache的配置中删除那些不想要的Cache,然后重新加载配置。
要使用堆外内存,单个Cache的overflowToOffHeap属性必须是”true”。如果在CacheManager级别定义了堆外内存,那么就会自动的把所有的Cache节点的overflowToOffHeap属性改为“true”。在这种情况下,你可以在单个Cache下重写overflowToOffHeap的值为“false”,这样就不会被CacheManager统一改掉了。
3.3 本地磁盘(Local Disk)
缓存可以被写入本地磁盘,注意点:
• 隐式缓存(Distributed)不能被写入本地磁盘。
• 缓存的persistenceStrategy属性必须设定为"localTempSwap"。
• 本地磁盘是最慢的缓存类别模式。
4. 缓存大小的一些例子
以下演示了统一配置和单个Cache配置。
4.1 统一配置
CacheManager级别的统一配置:
<ehcache xmlns... Name="CM1" maxBytesLocalHeap="100M" maxBytesLocalOffHeap="10G" maxBytesLocalDisk="50G"> ... <cache name="Cache1" ... </cache> <cache name="Cache2" ... </cache> <cache name="Cache3" ... </cache> </ehcache>
名叫CM1的CacheManager自动的给每个缓存(Cache1,Cache2,Cache3)分配属性大小值。每个缓存都会得到三分之一的堆内存(maxBytesLocalHeap="100M"),堆外内存(maxBytesLocalOffHeap="10G")以及本地内存(maxBytesLocalDisk="50G")。
注,在CacheManager级别只能分配比特-类型(bytes)相关的属性。
4.2 明确Cache大小
你也可以明确的每个缓存分配大小:
<ehcache xmlns... Name="CM1" maxBytesLocalHeap="100M" maxBytesLocalOffHeap="10G" maxBytesLocalDisk="60G"> ... <cache name="Cache1" ... maxBytesLocalHeap="50M" ... </cache> <cache name="Cache2" ... maxBytesLocalOffHeap="5G" ... </cache> <cache name="Cache3" ... </cache> </ehcache>
以上的例子中,Cache1分配获得了50M的堆内存;其它缓存(Cache2\Cache3)再平均分配剩余的堆内存空间(100M-50M=50M)。Cache2的堆外内存配置是5G,那么其它的缓存再平均分配剩余的堆外内存空间(10G-5G=5G)。所以虽然Cache3没有单独配置,根据头部公用配置(也就是CacheManager级别),我们可以得知,Cache3的堆内存是25M,堆外内存为2.5G以及本地磁盘大小是20Gb。
在缓存中配置了某个属性,获得了一部分的公用配置的大小,但并不意味着就必须要使用。比如Cache1配置了50M的堆内存,那么就可以使用50Mb中的任何大小。
值得注意的是缓存配置必须使用相同的属性来创建一个公用的配置(pool)。比如Cache1就不能再使用属性maxEntriesLocalHeap来从公用配置中获得堆内存(节点-类型)的大小(因为公用头部配置的是属性maxBytesLocalHeap)。
4.3 混合配置
如果一个CacheManager没有配置某一属性,单个节点的Cache仍然能够单独配置,具体示例如下:
<ehcache xmlns... Name="CM2" maxBytesLocalHeap="100M"> ... <cache name="Cache4" ... maxBytesLocalHeap="50M" maxEntriesLocalDisk="100000" ... </cache> <cache name="Cache5" ... maxBytesLocalOffHeap="10G" ... </cache> <cache name="Cache6" ... </cache> </ehcache>
名叫CM2的CacheManager创建了一个配置,堆内存大小为100M。它下面的所有缓存都将受这个配置的约束。单个Cache可以再配置其它自己的属性。例如Cache4配置了本地磁盘的最大值,Cache5配置了堆外内存空间,因为Cache6虽然没有Cache级别的配置,但因为CacheManager级别有配置堆内存,所以Cache6能获得(100M-50M)/2 = 25M的堆内存。
4.4 使用百分比
我们也可以使用百分比来配置,具体示例如下:
<ehcache xmlns... Name="CM1" maxBytesLocalHeap="1G" maxBytesLocalOffHeap="10G" maxBytesLocalDisk="50G"> ... <!-- Cache1 gets 400Mb of heap, 2.5Gb of off-heap, and 5Gb of disk. --> <cache name="Cache1" ... maxBytesLocalHeap="40%"> </cache> <!-- Cache2 gets 300Mb of heap, 5Gb of off-heap, and 5Gb of disk. --> <cache name="Cache2" ... maxBytesLocalOffHeap="50%"> </cache> <!-- Cache2 gets 300Mb of heap, 2.5Gb of off-heap, and 40Gb of disk. --> <cache name="Cache3" ... maxBytesLocalDisk="80%"> </cache> </ehcache>
你可以使用百分比来配置属性maxBytesLocalHeap。如果在CacheManager级别配置了百分比,那么表示占总的JVM内存的百分之多少。如果是在Cache级别配置了百分比,那么表示它占它所属的CacheManager配置的百分之多少。
4.5 只配置Cache级别
本示例中,在CacheManager级别不配置,而只在Cache级别配置:
<ehcache xmlns... Name="CM3" ... > ... <cache name="Cache7" ... maxBytesLocalHeap="50M" maxEntriesLocalDisk="100000" ... </cache> <cache name="Cache8" ... maxEntriesLocalHeap="1000" maxBytesLocalOffHeap="10G" ... </cache> <cache name="Cache9" ... maxBytesLocalHeap="50M" ... </cache> </ehcache>
在不配置CacheManager级别时,缓存也可以单个独立配置。需要注意的是单个缓存的配置必须声明堆内存的配置,这是因为堆内存没有统一声明配置。总之,堆内存的配置是必须存在的,要么在CacheManager上统一配置,要么在Cache级别上单独配置。
4.6 溢出 (Overflows)
Caches that do not specify overflow will overflow if a pool is set for off-heap and disk.
如果配置了堆外内存和本地磁盘,当堆内存满后,会自动溢出到堆外内存和本地磁盘,若没有配置,则不会溢出:
<ehcache maxBytesLocalHeap="1g" maxBytesLocalOffHeap="4g" maxBytesLocalDisk="100g" > <cache name="explicitlyAllocatedCache1" maxBytesLocalHeap="50m" maxBytesLocalOffHeap="200m" timeToLiveSeconds="100"> </cache> <!—当堆内存溢出后,不会使用堆外内存(off-heap),因为堆外内存使用标识为false --> <cache name="automaticallyAllocatedCache2" timeToLiveSeconds="100" overflowToOffHeap="false"> </cache> </ehcache> <!—不会使用本地磁盘,因为配置中使用了Fast Restart(快速重启)。(该处磁盘的用处为:它可以在重启的时候将堆内存或者非堆内存里面的元素持久化到硬盘上,重启之后再从硬盘上恢复元素到内存中。该策略只对企业版Ehcache有用。) --> <cache name="explicitlyAllocatedCache2" maxLocalHeap="10%" maxBytesLocalOffHeap="200m" timeToLiveSeconds="100"> <persistence strategy="localRestartable"/> </cache> <!—当堆内存满后,会自动溢出到堆外内存和本地磁盘,因为在CacheManager级别没有特殊的配置。 --> <cache name="automaticallyAllocatedCache1" timeToLiveSeconds="100"> </cache>
5. 分布式缓存大小
分布式缓存在企业式Ehcache下有效,也可以按以上的例子进行配置,除了不能使用本地磁盘(换句话说不能使用*LocalDisk来配置)。分布式缓存可以使用堆内存Terracotta集群技术来(一款由美国Terracotta公司开发的著名开源Java集群平台)来存储资原(堆内存或磁盘)。
分布式缓存中,每个节点下可以为相同的缓存配置独立的属性。那意味着当相同的要素和属性被Ehcache配置所加载时,在同一个缓存下,这些配置在不同的节点上的属性都可以同时被多个节点所使用。
例如:一个缓存可能有以下这样的配置:
<cache name="myCache" maxEntriesOnHeap="10000" maxBytesLocalOffHeap="8g" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="1800"> <persistence strategy="distributed"/> <terracotta/> </cache>
同样名叫myCache的缓存在另一个节点上可能有以下这样的配置:
<cache name="myCache" maxEntriesOnHeap="10000" maxBytesLocalOffHeap="10g" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="1800"> <persistence strategy="distributed"/> <terracotta/> </cache>
如果一个缓存超出了节点所配置的最大值,那么Terracotta会提供给名为myCache的缓存一个不限制大小的磁盘空间来备份溢出数据。如果要做限制,可以使用属性maxEntriesInCache,其值可配值任意一个正数。
<cache name="myCache" maxEntriesOnHeap="10000" maxBytesLocalOffHeap="10g" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="1800" maxEntriesInCache="1000000"> <persistence strategy="distributed"/> <terracotta/> </cache>
Terracotta将会回收myCache的超出属性maxEntriesInCache配置的部分。对于任何一个缓存,Terracotta回收机制都是基于那个最大的配置。除此之外,Terracotta不会回收已经存在于客户端的缓存节点,同样的新配置的属性maxEntriesInCache在已经生效于客户端的缓存也同样无效。
6. 建立计算缓存大小机制
Ehcache建立缓存大小机制的步骤分为计算数据元素的大小和按照CacheManager中的配置来强制限制其大小。
众所周知,JAVA是面向对象语言,那么类的属性可以是另一个对象。在每个元素在存入内存(或磁盘)时会被计算其大小,包括键值(Key)和元素值(Value)的大小,也包括这个类的属性引用其它类型的值的大小。这个可以看成是递归形式的计算。
这意味着一个被很多其它类引用的对象,在每次被引用的时候都会被计算。这个被引用的对象我们称之为“引用对象”,这会导致计算结果过份庞大。“引用对象”应该被忽略计算。
6.1 忽略计算大小
我们可以使用annotation标签@IgnoreSizeOf来标记为可以忽略计算“引用对象”。这个annotation标签可以是方法级别的,类级别的或是包级别的。也可以定义一个忽略名单的文件包含类名、方法名、包名。
@IgnoreSizeOf是不能被继承的,子类如果没有标记,那么当别的类引用它时,还是会计算其大小。
以下示例:忽略Dog.class
@IgnoreSizeOf public class Dog { private Gender gender; private String name; }
以下示例:忽略属性sharedInstance
public class MyCacheEntry { @IgnoreSizeOf private final SharedClass sharedInstance; ... }
以下示例:当在包com.pany.ignore package上加入标签@IgnoreSizeOf,那么在计算缓存大小时,会忽略整个包下的资源
@IgnoreSizeOf package com.pany.ignore; import net.sf.ehcache.pool.sizeof.filter.IgnoreSizeOf;
我们也可以定义一个文件来声明要忽略的类和属性,这个文件需要用系统属性net.sf.ehcache.sizeof.filter来标明出处。
# That field references a common graph between all cached entries com.pany.domain.cache.MyCacheEntry.sharedInstance # This will ignore all instances of that type com.pany.domain.SharedState # This ignores a package com.pany.example
注:这些衡量方法和配置忽略大小的方法只针对堆内存有效。如果一个元素已经被存在了堆外内存或磁盘中,或企业级的Terracotta中,那么他们会被序列化成比特数组。这个计算就变的简单多了,我们只需要计算这些比特数据的大小,而不用在意引用关系等。
6.2 限制遍历对象的配置
综上所述,缓存的大小与引用的对象有关。我们可以使用annotations标签来标明是否需要计算。另一方面,CacheManager和cache级别都定义了其缓存的配置大小。
注:以下配置对分布式缓存无效。
6.2.1 CacheManager级别计算
以下配置表明,在CacheManager级别中,size-of引擎可以计算多少深度的堆内存的元素:(译者注:如果理解深度这个概念,介于JAVA都是引用型的对象,所以可以用树的深度来类比)
<sizeOfPolicy maxDepth="100" maxDepthExceededBehavior="abort"/>
这个配置有以下两个属性:
• maxDepth – 表示size-of引擎可以目标对象可以访问其引用的对象的最大深度。若配置了sizeOfPolicy,那么该元素是必须要配置的。
• maxDepthExceededBehavior – 标明当超出最大深度(>maxDepth)时的措施:可以配置的值:continue/abort
"continue" - 默认配置。表示当计算的值超出最大深度时,会打印WARN级别的log,并且会继续执行(不会强制退出报错)。
"abort" - 当SizeOf引擎计算失败时,会打印WARN级别的log,并返回错误。在这个配置下,方法 Ehcache.hasAbortedSizeOf() 返回true。
该SizeOf的配置可以放在CacheManager级别的配置下(即<ehcache>),也可放在cache配置级别下(即<cache>或<defaultCache>),在cache级别下的配置优先级要高于CacheManager级别下的(即两者都有配置的话,以cache的为先)。
注:sizeOfPolicy对分布式缓存无效。
6.2.2 Cache级别计算
在Cache级别(<cache>)使用<sizeOfPolicy>来定义size-of引擎的计算规则时,如同上一段落所说的,优先级别比CacheManager级别要高。
6.2.3 调试Size-Of
当计算大小的过程中出现警告或错误时(通常是size-of引擎报错),可采取以下方法来获得更多的调试信息:
• 将系统属性(system property)=net.sf.ehcache.sizeof.verboseDebugLogging设成 true
• 若你的log是用SLF4J实现的,那么将LOG信息为DEBUG级别设为可见(即打印到控制台或文件)。
发表评论
-
【翻译】运用MapReduce找到社交媒体中的共同朋友
2016-10-22 16:24 729原文:http://stevekrenzel.co ... -
【总结】<context:annotation-config> vs <context:component-scan>
2015-03-25 22:35 1162Spring mvc3中的<context:annota ... -
aaasdasd
2015-02-06 15:30 0http://www.quartz-scheduler.org ... -
【翻译】优秀的RESTful API的设计原则
2014-08-25 22:11 3076原文地址:http://codeplanet.io/princ ...
相关推荐
配置文件定义了缓存策略,包括缓存大小、存活时间等。 10. **ehcache-app.xml**:可能是一个特定于Jeecms应用的Ehcache配置,用于扩展或覆盖ehcache.xml中的设置,优化特定场景下的缓存行为。 通过分析这些文件,...
拟阵约束下最大化子模函数的模型及其算法的一种熵聚类方法.pdf
内容概要:本文探讨了在两级电力市场环境中,针对省间交易商的最优购电模型的研究。文中提出了一个双层非线性优化模型,用于处理省内电力市场和省间电力交易的出清问题。该模型采用CVaR(条件风险价值)方法来评估和管理由新能源和负荷不确定性带来的风险。通过KKT条件和对偶理论,将复杂的双层非线性问题转化为更易求解的线性单层问题。此外,还通过实际案例验证了模型的有效性,展示了不同风险偏好设置对购电策略的影响。 适合人群:从事电力系统规划、运营以及风险管理的专业人士,尤其是对电力市场机制感兴趣的学者和技术专家。 使用场景及目标:适用于希望深入了解电力市场运作机制及其风险控制手段的研究人员和技术开发者。主要目标是为省间交易商提供一种科学有效的购电策略,以降低风险并提高经济效益。 其他说明:文章不仅介绍了理论模型的构建过程,还包括具体的数学公式推导和Python代码示例,便于读者理解和实践。同时强调了模型在实际应用中存在的挑战,如数据精度等问题,并指出了未来改进的方向。
内容概要:本文探讨了在MATLAB/Simulink平台上针对四机两区系统的风储联合调频技术。首先介绍了四机两区系统作为经典的电力系统模型,在风电渗透率增加的情况下,传统一次调频方式面临挑战。接着阐述了风储联合调频技术的应用,通过引入虚拟惯性控制和下垂控制策略,提高了系统的频率稳定性。文章展示了具体的MATLAB/Simulink仿真模型,包括系统参数设置、控制算法实现以及仿真加速方法。最终结果显示,在风电渗透率为25%的情况下,通过风储联合调频,系统频率特性得到显著提升,仿真时间缩短至5秒以内。 适合人群:从事电力系统研究、仿真建模的技术人员,特别是关注风电接入电网稳定性的研究人员。 使用场景及目标:适用于希望深入了解风储联合调频机制及其仿真实现的研究人员和技术开发者。目标是掌握如何利用MATLAB/Simulink进行高效的电力系统仿真,尤其是针对含有高比例风电接入的复杂场景。 其他说明:文中提供的具体参数配置和控制算法有助于读者快速搭建类似的仿真环境,并进行相关研究。同时强调了参考文献对于理论基础建立的重要性。
内容概要:本文介绍了永磁同步电机(PMSM)无感控制技术,特别是高频方波注入与滑膜观测器相结合的方法。首先解释了高频方波注入法的工作原理,即通过向电机注入高频方波电压信号,利用电机的凸极效应获取转子位置信息。接着讨论了滑膜观测器的作用,它能够根据电机的电压和电流估计转速和位置,具有较强的鲁棒性。两者结合可以提高无传感器控制系统的稳定性和精度。文中还提供了具体的Python、C语言和Matlab代码示例,展示了如何实现这两种技术。此外,简要提及了正弦波注入的相关论文资料,强调了其在不同工况下的优势。 适合人群:从事电机控制系统设计的研发工程师和技术爱好者,尤其是对永磁同步电机无感控制感兴趣的读者。 使用场景及目标:适用于需要减少传感器依赖、降低成本并提高系统可靠性的情况,如工业自动化设备、电动汽车等领域的电机控制。目标是掌握高频方波注入与滑膜观测器结合的具体实现方法,应用于实际工程项目中。 其他说明:文中提到的高频方波注入和滑膜观测器的结合方式,不仅提高了系统的性能,还在某些特殊情况下表现出更好的适应性。同时,附带提供的代码片段有助于读者更好地理解和实践这一技术。
内容概要:本文深入探讨了MATLAB中扩展卡尔曼滤波(EKF)和双扩展卡尔曼滤波(DEKF)在电池参数辨识中的应用。首先介绍了EKF的基本原理和代码实现,包括状态预测和更新步骤。接着讨论了DEKF的工作机制,即同时估计系统状态和参数,解决了参数和状态耦合估计的问题。文章还详细描述了电池参数辨识的具体应用场景,特别是针对电池管理系统中的荷电状态(SOC)估计。此外,提到了一些实用技巧,如雅可比矩阵的计算、参数初始值的选择、数据预处理方法等,并引用了几篇重要文献作为参考。 适合人群:从事电池管理系统开发的研究人员和技术人员,尤其是对状态估计和参数辨识感兴趣的读者。 使用场景及目标:适用于需要精确估计电池参数的实际项目,如电动汽车、储能系统等领域。目标是提高电池管理系统的性能,确保电池的安全性和可靠性。 其他说明:文章强调了实际应用中的注意事项,如数据处理、参数选择和模型优化等方面的经验分享。同时提醒读者关注最新的研究成果和技术进展,以便更好地应用于实际工作中。
内容概要:本文详细介绍了在无电子凸轮功能情况下,利用三菱FX3U系列PLC和威纶通触摸屏实现分切机上下收放卷张力控制的方法。主要内容涵盖硬件连接、程序框架设计、张力检测与读取、PID控制逻辑以及触摸屏交互界面的设计。文中通过具体代码示例展示了如何初始化寄存器、读取张力传感器数据、计算张力偏差并实施PID控制,最终实现稳定的张力控制。此外,还讨论了卷径计算、速度同步控制等关键技术点,并提供了现场调试经验和优化建议。 适合人群:从事自动化生产设备维护和技术支持的专业人士,尤其是熟悉PLC编程和触摸屏应用的技术人员。 使用场景及目标:适用于需要对分切机进行升级改造的企业,旨在提高分切机的张力控制精度,确保材料切割质量,降低生产成本。通过本方案可以实现±3%的张力控制精度,满足基本生产需求。 其他说明:本文不仅提供详细的程序代码和硬件配置指南,还分享了许多实用的调试技巧和经验,帮助技术人员更好地理解和应用相关技术。
内容概要:本文详细介绍了一种基于西门子S7-200和S7-300 PLC以及组态王软件的三泵变频恒压供水系统。主要内容涵盖IO分配、接线图原理图、梯形图程序编写和组态画面设计四个方面。通过合理的硬件配置和精确的编程逻辑,确保系统能够在不同负载情况下保持稳定的供水压力,同时实现节能和延长设备使用寿命的目标。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和组态软件使用的专业人士。 使用场景及目标:适用于需要稳定供水的各种场合,如住宅小区、工厂等。目标是通过优化控制系统,提升供水效率,减少能源消耗,并确保系统的可靠性和安全性。 其他说明:文中提供了详细的实例代码和调试技巧,帮助读者更好地理解和实施该项目。此外,还分享了一些实用的经验教训,有助于避免常见的错误和陷阱。
内容概要:本文详细介绍了三相三线制静止无功发生器(SVG/STATCOM)在Simulink中的仿真模型设计与实现。主要内容涵盖ip-iq检测法用于无功功率检测、dq坐标系下的电流解耦控制、电压电流双闭环控制系统的设计、SVPWM调制技术的应用以及具体的仿真参数设置。文中不仅提供了理论背景,还展示了具体的Matlab代码片段,帮助读者理解各个控制环节的工作原理和技术细节。此外,文章还讨论了实际调试中遇到的问题及解决方案,强调了参数调整的重要性。 适合人群:从事电力系统自动化、电力电子技术研究的专业人士,特别是对SVG/STATCOM仿真感兴趣的工程师和研究人员。 使用场景及目标:适用于希望深入了解SVG/STATCOM工作原理并掌握其仿真方法的研究人员和工程师。目标是在实践中能够正确搭建和优化SVG/STATCOM的仿真模型,提高无功补偿的效果。 其他说明:文章提供了丰富的实例代码和调试技巧,有助于读者更好地理解和应用所学知识。同时,文中提及的一些经验和注意事项来源于实际项目,具有较高的参考价值。
基于SIMULINK的风力机发电效率建模探究.pdf
内容概要:本文介绍了如何将CarSim的动力学模型与Simulink的智能算法相结合,利用模型预测控制(MPC)实现车辆的智能超车换道。主要内容包括MPC控制器的设计、路径规划算法、联合仿真的配置要点以及实际应用效果。文中提供了详细的代码片段和技术细节,如权重矩阵设置、路径跟踪目标函数、安全超车条件判断等。此外,还强调了仿真过程中需要注意的关键参数配置,如仿真步长、插值设置等,以确保系统的稳定性和准确性。 适合人群:从事自动驾驶研究的技术人员、汽车工程领域的研究人员、对联合仿真感兴趣的开发者。 使用场景及目标:适用于需要进行自动驾驶车辆行为模拟的研究机构和企业,旨在提高超车换道的安全性和效率,为自动驾驶技术研发提供理论支持和技术验证。 其他说明:随包提供的案例文件已调好所有参数,可以直接导入并运行,帮助用户快速上手。文中提到的具体参数和配置方法对于初学者非常友好,能够显著降低入门门槛。
内容概要:本文详细介绍了利用MATLAB进行信号与系统实验的具体步骤和技术要点。首先讲解了常见信号(如方波、sinc函数、正弦波等)的生成方法及其注意事项,强调了时间轴设置和参数调整的重要性。接着探讨了卷积积分的两种实现方式——符号运算和数值积分,指出了各自的特点和应用场景,并特别提醒了数值卷积时的时间轴重构和步长修正问题。随后深入浅出地解释了频域分析的方法,包括傅里叶变换的符号计算和快速傅里叶变换(FFT),并给出了具体的代码实例和常见错误提示。最后阐述了离散时间信号与系统的Z变换分析,展示了如何通过Z变换将差分方程转化为传递函数以及如何绘制零极点图来评估系统的稳定性。 适合人群:正在学习信号与系统课程的学生,尤其是需要完成相关实验任务的人群;对MATLAB有一定基础,希望通过实践加深对该领域理解的学习者。 使用场景及目标:帮助学生掌握MATLAB环境下信号生成、卷积积分、频域分析和Z变换的基本技能;提高学生解决实际问题的能力,避免常见的编程陷阱;培养学生的动手能力和科学思维习惯。 其他说明:文中不仅提供了详细的代码示例,还分享了许多实用的小技巧,如如何正确保存实验结果图、如何撰写高质量的实验报告等。同时,作者以幽默风趣的语言风格贯穿全文,使得原本枯燥的技术内容变得生动有趣。
KUKA机器人相关文档
内容概要:本文详细介绍了无传感器永磁同步电机(PMSM)控制技术,特别是针对低速和中高速的不同控制策略。低速阶段采用I/F控制,通过固定电流幅值和斜坡加速的方式启动电机,确保平稳启动。中高速阶段则引入滑模观测器进行反电动势估算,从而精确控制电机转速。文中还讨论了两者之间的平滑切换逻辑,强调了参数选择和调试技巧的重要性。此外,提供了具体的伪代码示例,帮助读者更好地理解和实现这一控制方案。 适合人群:从事电机控制系统设计的研发工程师和技术爱好者。 使用场景及目标:适用于需要降低成本并提高可靠性的应用场景,如家用电器、工业自动化设备等。主要目标是掌握无传感器PMSM控制的基本原理及其优化方法。 其他说明:文中提到的实际案例和测试数据有助于加深理解,同时提醒开发者注意硬件参数准确性以及调试过程中可能出现的问题。
智能家居与物联网培训材料.ppt
内容概要:本文详细介绍了使用Matlab解决车辆路径规划问题的四种经典算法:TSP(旅行商问题)、CVRP(带容量约束的车辆路径问题)、CDVRP(带容量和距离双重约束的车辆路径问题)和VRPTW(带时间窗约束的车辆路径问题)。针对每个问题,文中提供了具体的算法实现思路和关键代码片段,如遗传算法用于TSP的基础求解,贪心算法和遗传算法结合用于CVRP的路径分割,以及带有惩罚函数的时间窗约束处理方法。此外,还讨论了性能优化技巧,如矩阵运算替代循环、锦标赛选择、2-opt局部优化等。 适合人群:具有一定编程基础,尤其是对物流调度、路径规划感兴趣的开发者和技术爱好者。 使用场景及目标:适用于物流配送系统的路径优化,旨在提高配送效率,降低成本。具体应用场景包括但不限于外卖配送、快递运输等。目标是帮助读者掌握如何利用Matlab实现高效的路径规划算法,解决实际业务中的复杂约束条件。 其他说明:文中不仅提供了详细的代码实现,还分享了许多实践经验,如参数设置、数据预处理、异常检测等。建议读者在实践中不断尝试不同的算法组合和优化策略,以应对更加复杂的实际问题。
软考网络工程师2010-2014真题及答案完整版 全国计算机软考 适合软考中级人群
包括:源程序工程文件、Proteus仿真工程文件、论文材料、配套技术手册等 1、采用51/52单片机作为主控芯片; 2、采用1602液晶显示:测量酒精值、酒驾阈值、醉驾阈值; 3、采用PCF8591进行AD模数转换; 4、LED指示:正常绿灯、酒驾黄灯、醉驾红灯; 5、可通过按键修改酒驾醉驾阈值;
内容概要:本文详细介绍了利用MATLAB实现约束最优化求解的方法,主要分为两大部分:无约束优化和带约束优化。对于无约束优化,作者首先讲解了梯度下降法的基本原理和实现技巧,如步长搜索和Armijo条件的应用。接着深入探讨了带约束优化问题,特别是序列二次规划(SQP)方法的具体实现,包括拉格朗日函数的Hesse矩阵计算、QP子问题的构建以及拉格朗日乘子的更新策略。文中不仅提供了详细的MATLAB代码示例,还分享了许多调参经验和常见错误的解决办法。 适合人群:具备一定数学基础和编程经验的研究人员、工程师或学生,尤其是对最优化理论和应用感兴趣的读者。 使用场景及目标:适用于需要解决各类优化问题的实际工程项目,如机械臂能耗最小化、化工过程优化等。通过学习本文,读者能够掌握如何将复杂的约束优化问题分解为更易处理的二次规划子问题,从而提高求解效率和准确性。 其他说明:文章强调了优化算法选择的重要性,指出不同的问题结构决定了最适合的算法。此外,作者还分享了一些实用的经验教训,如Hesse矩阵的正定性处理和惩罚因子的动态调整,帮助读者少走弯路。
KUKA机器人相关资料