You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置文件,无法直接写百分比,但可以通过系统属性+启动参数的方式间接实现:

  1. 启动JVM时传入百分比参数:
    java -Dcache.heap.percent=20 -jar your-app.jar
    
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:05:52