Могу ли я закрыть дескрипторы файлов, открытые кодом, который мне не принадлежит? - PullRequest
5 голосов
/ 16 ноября 2011

Я использую стороннюю коммерческую библиотеку, у которой, похоже, есть утечка файловых дескрипторов (я проверял это в Linux, используя lsof).В конце концов сервер (Tomcat) начинает получать печально известную «Ошибка слишком большого количества открытых файлов», и мне приходится перезапускать JVM.

Я уже связался с поставщиком.Тем временем, однако, я хотел бы найти обходной путь для этого.Я не имею доступ к их исходному коду.Есть ли способ в Java очистить дескрипторы файлов , не имея доступа к исходному объекту File (или FileWriter, FileOutputStream и т. Д.)?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

забавным способом было бы написать динамическую библиотеку и использовать LD_PRELOAD для загрузки ее для экземпляра Java, который вы запускаете ... эта DLL может переопределить соответствующий базовый системный вызов open (2) (или использовать некоторую другую логику) длязакройте существующие файловые дескрипторы процесса перед передачей вызова реализации libc (или ядру).Вы должны вести серьезный учет и, возможно, иметь дело с потоками;Но это может быть сделано.Особенно, если вы берете подсказки из / proc / pid / fd / для определения, подходит ли закрытие для целевого fd.

0 голосов
/ 16 ноября 2011

Вы можете при запуске открыть группу файлов и использовать File*putStream.getFD(), чтобы получить группу java.io.FileDescriptor s , затем закрыть их, но удерживать дескрипторы , Позже может сможет создавать потоки , используя сохраненные FileDescriptor s, и закрывать их.

Я не проверял это, поэтому не удивлюсь, если бы он не работал на некоторых платформах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...