Какой хороший шаблон для модульного теста Java, который гарантирует, что вы правильно закрываете файлы? - PullRequest
4 голосов
/ 26 сентября 2011

У меня есть проблема в моей кодовой базе, когда мы неправильно закрываем дескрипторы файлов или, возможно, потоки. В конце концов мы получаем исключение TooManyOpenFiles при очень большой нагрузке. Основываясь на выводе lsof, мы почти уверены, что знаем, где находится утечка (в нашей системе ведения журналов), но мой вопрос: как я могу написать модульный тест, который по завершении проверяет, что ресурсы были закрыты должным образом? Есть ли способ запросить JRE, чтобы узнать, сколько файлов в настоящее время открыто? Могу ли я как-то перехватить файловые операции, чтобы я мог их отслеживать?

Я подозреваю, что мне придется использовать свой код для управления всеми операциями ввода-вывода, подсчета ссылок и обеспечения того, чтобы они закрывались таким образом, но если кто-то знает о нисходящем решении, схожем с этими идеями Я упоминал выше, это было бы огромной помощью!

Ответы [ 3 ]

3 голосов
/ 26 сентября 2011

Вы можете использовать инструмент аспектно-ориентированного программирования (AOP), например AspectJ , чтобы добавить код для подсчета открытых / закрытых файлов в FileInputStream и FileOutputStream. Это довольно легко сделать (детали зависят от инструмента, конечно) надежный и неинвазивный.

2 голосов
/ 26 сентября 2011

Поскольку вы говорите о тестах, PowerMock http://code.google.com/p/powermock/ может сработать.Это позволяет высмеивать статические методы и конструкторы, если я не ошибаюсь.Таким образом, вы можете высмеивать / шпионить за конструкторами и методами close или тем, что вам когда-либо понадобится для освобождения ресурсов.

Я стараюсь избегать этого в моих тестах, но в случае, который вы описываете, это может стоитьнервотрепки.

0 голосов
/ 26 сентября 2011

Похоже, вы можете смотреть это через JMX.

Кто-то разместил здесь код: http://java -monitor.com / forum / showthread.php? T = 130

Вам нужно включить JMX в вашей JVM, если вы этого еще не сделали.

...