Всегда ли важно всегда закрывать ресурсы?

Много раз я встречался с утверждением, что приложение должно всегда явно закрывать все ресурсы, которые он открыл.

Мой подход к программированию довольно прагматичен, и я не люблю слепо следовать любому соглашению, которое я явно не вижу в преимуществах. Отсюда мой вопрос.

Предположим, что:

  1. У меня небольшое приложение
  2. Он открывает несколько ресурсов (например, файлы, подключения к базе данных, удаленные потоки) и обрабатывает их
  3. Он работает несколько минут, а затем выходит
  4. Скажем, это на Java (если язык имеет значение)

Мне действительно нужно заботиться о закрытии всех ресурсов, которые я открыл? Я думаю, все ресурсы, которые я открыл, будут закрыты/выпущены, когда приложение/виртуальная машина выйдет. Я прав?

Если это так, есть ли убедительные причины заботиться о закрытии ресурсов в таком маленьком, коротком рабочем приложении?

ОБНОВИТЬ:

Вопрос сугубо гипотетический, но аргумент не заботиться об этом заключается в том, что я могу просто взломать какой-то быстрый скрипт и не хочу писать лишний код, не связанный напрямую с проблемой: закрытие ресурсов, выполнение всего этого подробный материал try-catch-finally, обработка исключений, которые мне не нужны и т.д.

Вопрос заключается в том, есть ли какие-либо практические последствия, если вы этого не сделаете.

Ответ 1

Я думаю, все ресурсы, которые я открыл, будут закрыты/выпущены, когда приложение/виртуальная машина выйдут.

Что происходит с ресурсом, который не был регулярно выпущен, не поддается контролю. Это может не навредить, или может это сделать. Он также сильно зависит от платформы, поэтому тестирование только одного не поможет.

почему я должен заботиться о закрытии этих ресурсов в таком небольшом, коротком рабочем приложении?

Размер приложения не должен иметь значения. Во-первых, приложения обычно растут; во-вторых, если вы не практикуете это правильно, вы не будете знать, как это сделать, когда это имеет значение.

Ответ 2

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

Согласно документам

Типичное приложение Java управляет несколькими типами ресурсов, такими как файлы, потоки, сокеты и соединения с базой данных. Такие ресурсы должны обрабатываться с большой осторожностью, поскольку они приобретают системные ресурсы для их операций. Таким образом, вам необходимо обеспечить, чтобы они освобождались даже в случае ошибок.

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

try-with-resources Заявление, введенное в java 7 для программистов, которые ненавидят тесные заявления.

Ответ 3

Короткий ответ - Да. Во-первых, это ТЕРРИБИРУЮЩАЯ практика кодирования так же, как и в любой другой области жизни, чтобы не очистить себя. С другой стороны, вы не можете предсказать, будет ли операционная система распознавать, что среда java больше не нуждается в ресурсах, и у вас могут быть блокировки на файлах /etc, которые не могут быть выпущены без принудительного перезапуска.

Всегда очищайте все ресурсы, которые вы открываете!

Обновление вашего первоначального обновления - требуется 5 секунд, чтобы добавить блок try/catch для закрытия любых открытых ресурсов и может помешать вам потратить 5 минут на перезагрузку компьютера. Выполнение этого права всегда экономит время в конце. Мой папа всегда говорил мне, что истинный ленивый человек делает все правильно в первый раз, поэтому им не нужно возвращаться и делать это снова. Я просто говорю, не ленитесь и делайте все правильно. 5 секунд, которые требуется для записи блока catch, никогда не замедлит процесс записи... 5 секунд, которые вы сохранили, не записав, это может значительно замедлить вашу отладку.