Мы используем Java 8 Spring Boot 2 для нашего приложения для микро-сервисов. Выполнение нагрузочного теста локально обнаружило, что память использует кучу, но никогда не освобождается обратно. Я запускаю приложение с сборщиком мусора G1, а также выполнил ручной сборщик мусора из JVisualVM, но выделенная память так и не освобождается.
Я взял дамп кучи и проанализировал его, и я ясно вижу большой байтмассив, созданный System Class Loader, указан как подозреваемый на утечку. Я вижу, что экземпляр байтового массива содержит мой HTTP-запрос к конечной точке "/ test". Но нагрузочный тест уже завершен, и потоки вернулись туда, где были до запуска нагрузочного теста.
Не уверен, почему байтовый массив, загруженный загрузчиком системного класса, содержит все эти элементы и без всякой причины берет всю эту кучу.
JVisualVM
Подозреваемые утечки
байтовый массив
Объектыс исходящей ссылкой
/ конечная точка теста является единственным методом в классе @RestController
@RequestMapping(value = "/test", method = RequestMethod.GET)
@CrossOrigin(origins = "*")
public void test() {
logger.info("Testing1...");
}
Ниже приведены приложения Spring Boot.properties, связанные с сервером:
server.port=8090
server.tomcat.max-threads=200
server.tomcat.accept-count=100
server.tomcat.min-spare-threads=20
server.error.whitelabel.enabled=false
server.max-http-header-size=2097152