Ehcache持久化到磁盘失败?
项目使用JFinal框架,使用了Ehcache对一些常用的Service方法做缓存,也使用了findByCache()将一些不常改变的sql语句用作缓存
但是今天检查日志时发现了一些错误日志,如下:
2017-11-16 10:24:47.355 [com%002eapp%002evocalist%002eservice%002e%0053ong%0053ervice%002eget%0053ong%0042y%0054ime.data] ERROR net.sf.ehcache.store.disk.DiskStorageFactory - Disk Write of com.app.vocalist.service.SongService.getSongByTime?pageNum=1&pageSize=8 failed:
java.lang.OutOfMemoryError: Java heap space
2017-11-16 10:24:47.402 [com%002eapp%002evocalist%002eservice%002e%0057ork%0053ervice%002eget%0052ecommend%0041udio.data] ERROR net.sf.ehcache.store.disk.DiskStorageFactory - Disk Write of com.app.vocalist.service.WorkService.getRecommendAudio?pageNum=1&pageSize=4 failed:
java.lang.OutOfMemoryError: Java heap space
2017-11-16 10:24:47.402 [com%002eapp%002evocalist%002eservice%002e%0057ork%0053ervice%002eget%0052ecommend%0056ideo.data] ERROR net.sf.ehcache.store.disk.DiskStorageFactory - Disk Write of com.app.vocalist.service.WorkService.getRecommendVideo?pageNum=1&pageSize=4 failed:
java.lang.OutOfMemoryError: Java heap space
2017-11-16 10:24:47.387 [com%002eapp%002evocalist%002eservice%002e%0042anner%0053ervice%002eget%0052ecommend%0042anner.data] ERROR net.sf.ehcache.store.disk.DiskStorageFactory - Disk Write of com.app.vocalist.service.BannerService.getRecommendBanner?bannerNum=4 failed:
java.lang.OutOfMemoryError: Java heap space
我的ehcache.xml默认cache配置如下:
<!--默认cache的时间为3分钟--> <defaultCache maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" overflowToDisk="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="180" memoryStoreEvictionPolicy="LFU" > </defaultCache>
根据日志错误信息,我查看了Java堆内存是否足够,发现剩余Java堆空间仍有100~250MB可用,目前有几个疑惑,望高手解答!
1.我配置的defaultCache的overflowToDisk=true,这个属性不是只有当内存中数据超过内存限制时才会将缓存写入到磁盘吗?但是我在同一个cachename写的缓存条数应该是达不到最大值的,为什么还会将缓存写入磁盘?
2.错误提示Java Heap space OOM,但是Java堆还是有剩余空间的,如果Java堆内存不足,应该会直接宕机,还是上述错误中的OOM与真正会导致宕机的OOM标准不一致?
上述提供了一些基本的信息,如果还需要其他信息,我再贴出,望高手解答,谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
引用来自“JFinal”的评论
此外,还要注意是不是有内存泄漏的代码存在,用 jvisualvm 检查一下
引用来自“huojianguo”的评论
应该是没有启动内存缓存监听器吧,
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
应该是没有启动内存缓存监听器吧,
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
按照上面站长的建议再次查了下Java内存,发现Java Heap容量足够,但是Java Metaspace容量已经满了,当时看JVM书的时候Java内存中没有Metaspace这一部分,看名字应该是"元数据",现在百度找下问题原因
此外,还要注意是不是有内存泄漏的代码存在,用 jvisualvm 检查一下
发生了 OutOfMemoryError,不要放太大的数据到内存