Ehcache 3.x如何按JVM堆百分比设置堆大小?对应2.x的maxBytesLocalHeap
Ehcache 3.x 按JVM堆百分比设置缓存堆大小的实现方式
Ehcache 3.x 没有直接提供像2.x中maxBytesLocalHeap那样的百分比字符串配置项,但完全可以通过编程式配置或结合系统属性的声明式配置实现按JVM堆百分比指定缓存堆大小,以下是具体实现方式:
一、编程式配置(Java API)
通过ResourcePoolsBuilder动态计算JVM堆的百分比值,再设置缓存堆大小:
import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.builders.ResourcePoolsBuilder; import org.ehcache.config.units.MemoryUnit; public class EhcachePercentConfig { public static void main(String[] args) { // 计算JVM堆的20%作为缓存堆大小 long maxHeapSize = Runtime.getRuntime().maxMemory(); long cacheHeapSize = (long) (maxHeapSize * 0.2); // 构建缓存配置 CacheConfigurationBuilder<Object, Object> cacheConfig = CacheConfigurationBuilder.newCacheConfigurationBuilder( Object.class, Object.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(cacheHeapSize, MemoryUnit.BYTES) // 设置计算后的堆大小 .offheap(100, MemoryUnit.MB) // 可选:搭配堆外内存 ); } }
二、声明式配置(结合系统属性)
如果使用XML或YAML配置文件,无法直接写百分比,但可以通过系统属性+启动参数的方式间接实现:
- 启动JVM时传入百分比参数:
java -Dcache.heap.percent=20 -jar your-app.jar - 在Ehcache XML配置中借助框架表达式动态计算(以Spring SpEL为例):
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ehcache.org/v3" xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd"> <cache alias="myCache"> <key-type>java.lang.Object</key-type> <value-type>java.lang.Object</value-type> <resources> <!-- 通过SpEL计算堆的指定百分比 --> <heap unit="BYTES">#{T(java.lang.Runtime).getRuntime().maxMemory() * ${cache.heap.percent:20} / 100}</heap> </resources> </cache> </config>
注意事项
- 计算堆大小时,
Runtime.getRuntime().maxMemory()返回的是JVM最大堆内存(即-Xmx参数指定的值),建议启动JVM时明确设置-Xmx,避免计算结果不稳定。 - 多缓存实例共享JVM堆时,需控制总缓存堆大小总和,预留至少30%堆内存给应用本身,防止OOM。
- Ehcache 3.x的资源模型更侧重精细化控制,默认推荐明确数值配置,但上述方式可灵活实现百分比配置需求。
内容的提问来源于stack exchange,提问作者destan
相关产品推荐
相关产品推荐

