ehCache 3.0 默认堆上条目大小(与休眠二级缓存一起使用)

Posted

技术标签:

【中文标题】ehCache 3.0 默认堆上条目大小(与休眠二级缓存一起使用)【英文标题】:ehCache 3.0 default on-heap entries size (used with hibernate 2nd level cache) 【发布时间】:2020-11-02 19:07:09 【问题描述】:

我通过 ehcache 3.0 实现启用了休眠二级缓存。我遇到了一个问题,缓存命中在大约 10k 条目上相对较快,而在大约 30k 条目上非常慢。缓慢不是线性的,这让我怀疑这些条目是存储在堆外或磁盘上的。我还通过获取堆栈跟踪并将序列化程序视为瓶颈来验证这一点(据我所知,堆上不应使用序列化程序)。我没有添加 ehcache.xml 配置文件。我似乎在默认设置下运行。知道 ehcache 的默认堆大小是多少吗?

【问题讨论】:

【参考方案1】:

缓慢不是线性的,这让我怀疑这些条目是存储在堆外或磁盘上的。

您需要配置此类行为。在不了解您的配置或程序的情况下,任何人都无法给出详细的建议。

根据您提供的信息,最可能的原因:

通过增加缓存大小,您的程序需要更多的堆内存。如果已用堆内存接近可用堆内存,您的程序会因为过多的垃圾回收而变慢。垃圾收集器需要“喘息空间”才能高效运行。

我对任何性能问题的一般方法:

了解您使用的 Java 实现的最大堆大小 使用您的操作系统工具查看当前正在发生的事情,并了解您的程序在内存、CPU 和 I/O 方面的资源使用情况。在 Linux 上是 vmstat 使用诸如 visualvm 之类的工具或打开 GC 日志以查看垃圾收集器活动 拥有可用于性能评估的可重现测试

要找到理想的堆和条目大小,我建议: 使用 5k 个条目运行测试。您的 Java 应用程序占用了多少内存?系统中有多少可用内存? 使用 10k 个条目运行测试。回答同样的问题。然后,您可以使用其他缓存大小线性预测内存量。

【讨论】:

以上是关于ehCache 3.0 默认堆上条目大小(与休眠二级缓存一起使用)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis缓存,包含一级缓存与二级缓存,包括ehcache二级缓存

内存池设计与实现总结

定义局部变量数组大小过大报错

Linux系统信息与系统资源

ehcache

具有 OneToMany 关系的休眠重复条目