首页 > 解决方案 > 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 开销限制的异常?

标签: javagarbage-collectionehcache

解决方案


推荐阅读