java - ehcache - 超出 GC 开销限制
问题描述
我们在使用 ehcache 缓存 gson 对象时遇到问题。gson 对象计数开始增加,当执行 GC 时,什么也没有发生。对象计数一直持续到超过 GC 开销限制。
代码1:
@RequestMapping(value = "/search2")
@Cacheable(value = "halfHourCache", keyGenerator = "haodfKeyGenerator")
@ResponseBody
public Object search2(BizData bizData, Page page, String sourceType) {
return SearchSourceRunner.search(bizData, page, sourceType, DiseaseKeyWorldFilter.class);
}
这是 JVM 堆监视器:
但是如果我们缓存 String 而不是 gson 对象,堆就可以了。缓存的 String 对象可以被 GC 清除。
代码2
@RequestMapping(value = "/search")
@Cacheable(value = "halfHourCache", keyGenerator = "haodfKeyGenerator")
public ResponseEntity<String> search(BizData bizData, Page page, String sourceType) {
return new ResponseEntity<>(new Gson().toJson(SearchSourceRunner.search(bizData, page, sourceType, DiseaseKeyWorldFilter.class)), HttpStatus.OK);
}
问题:
Code1 和 Code2 有什么区别?为什么 Code2 可以正常工作,但 Code1 出现超出 GC 开销限制的异常?
解决方案
推荐阅读
- node.js - App Engine Flexible cron 在 120 秒后终止
- c# - Windows IoT 树莓派上的 ASP.NET MVC 无法连接到 SQL 数据库
- c# - 允许用户只输入字符串作为答案
- javascript - 为什么我会因为这个 Javascript 函数而失去利润
- angular - 在 mat-select 中设置默认选项
- html - HTML 背景不透明度不影响前景
- sql - 删除 SQL 中的重复行
- ios - 资产目录和根捆绑目录中重复的应用程序图标
- vba - 从 vsto 调用的 word 宏
- javascript - 我应该如何在谷歌地图 Laravel 5.4 中添加条纹捐赠按钮