Одно из наших приложений допускает утечку файловых дескрипторов, и мы еще не нашли причину этого.
В коде я вижу несколько функций, похожих на эту:
public ResponseEntity<InputStreamResource> getFoo( ... ) {
InputStream content = getContent(...)
InputStreamResource isr = new InputStreamResource(content);
return ResponseEntity.status(HttpServletResponse.SC_OK).body(isr);
}
(проверки if
и try
/ catch
удалены для краткости)
Я уверен, что этот раздел вызывает проблему, потому что, когда я тестирую этот конкретный код с помощью JMeter, я вижу, что getContent()
не работает на этом этапе:
is = Files.newInputStream(f.toPath());
Обычно я закрываю InputStream
, но из-за этого короткого и простого кода я не могу закрыть поток перед return
или вызовом body
.
Когда я запускаю lsof
(код работает в Linux), я вижу, что тысячи файлов открыты в режиме чтения. Поэтому я уверен, что эта проблема вызвана тем, что поток не закрывается.
Есть ли код передовой практики, которым я должен торговать?
HEAD
этого не происходит, только сGET
- person Marged   schedule 14.08.2018