我使用ehcache 3.0实现启用了hibernate二级缓存。我遇到了一个问题,大约10k个条目的缓存命中率相对较快,而大约30k个条目则非常缓慢。速度不是线性的,这让我怀疑条目是在堆外或磁盘上存储的。我还验证了这一点,将stacktraces和序列化程序视为瓶颈(据我所知,在堆上不应该使用序列化程序(。我没有添加ehcache.xml配置文件。我似乎在默认设置下运行。知道ehcache的默认堆大小是多少吗?
速度不是线性的,这让我怀疑条目是在堆外或磁盘上存储的。
您需要配置这样的行为。没有人可以在不了解您的配置或程序的情况下给出详细的建议。
根据您提供的信息,最有可能的原因:
通过增加缓存大小,程序需要更多的堆内存。如果使用的堆内存接近可用的堆内存,则程序会因为垃圾收集过多而减慢速度。垃圾收集器需要";呼吸空间";高效运行。
我处理任何性能问题的一般方法:
- 了解所用Java实现的最大堆大小
- 使用操作系统工具查看当前正在发生的事情,并了解程序在内存、CPU和I/O方面的资源使用情况。在Linux上,它将是
vmstat
- 使用类似visualvm的工具或打开GC日志来查看垃圾收集器活动
- 有一个可重复的测试,可以用于性能评估
要找到理想的堆和条目大小,我建议:用5公里的参赛作品进行测试。Java应用程序占用了多少内存?系统中有多少可用内存?使用10k个条目运行测试。回答同样的问题。然后,您可以线性预测其他缓存大小的内存量。