У нас проблема с кэшированием объекта gson с использованием ehcache.Количество объектов 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?