Каковы последствия утечки ресурсов?

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

Это могут быть такие вещи, как незакрытые файлы или соединения с базой данных. На самом деле все, что было бы IDisposable в .net. Мы магазин Windows, но меня интересуют и другие операционные системы.

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


person Greg    schedule 24.04.2018    source источник
comment
Это зависит от многих факторов (что вы пропускаете, жизненный цикл процесса и т. д.).   -  person SLaks    schedule 24.04.2018
comment
@SLaks в основном, наш контекст — это веб-приложения .net, поэтому соединения с базами данных, http-клиенты и тому подобное выполняются в коротких потоках для длинных процессов.   -  person Greg    schedule 24.04.2018


Ответы (2)


Вместо того, чтобы думать о ресурсах как о «вещах», которые нужно «освобождать», лучше думать о приобретении IDisposable объекта как об ответственности, которую необходимо выполнить. Многие виды IDisposable объектов просят внешние сущности делать что-то от их имени до тех пор, пока они не уведомят эти сущности о том, что их услуги больше не нужны; тем самым они несут ответственность за то, чтобы эти внешние организации действительно получали такое уведомление. Когда Dispose вызывается на IDisposable, он может выполнить свою обязанность по уведомлению всех, чьими услугами он пользовался, что эти услуги больше не требуются.

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

Что касается последствий отказа от вызова Dispose, то они очень просты: вещи, которые должны были произойти в результате того, что службы объекта больше не требуются, не произойдут. Если объект должен был уведомить другие объекты или сущности о том, что их услуги больше не требуются, а они, в свою очередь, должны были уведомить другие объекты или сущности, ни одно из этих уведомлений не произойдет.

За исключением нескольких случаев, когда код будет использовать управляемый ресурс на протяжении всего жизненного цикла программы, и можно полагаться на то, что ОС распознает завершение программы как указание на то, что программа больше не нуждается в ее услугах, в целом будет проще вызывать Dispose для вещей, которые больше не нужны, независимо от того, действительно ли они «заботятся», чем пытаться определить случаи, когда серьезные проблемы будут вызваны возникающими в результате сбоями организаций, чтобы уведомить все, что заботится о том, что их услуги больше не являются нужный.

person supercat    schedule 26.04.2018
comment
Мне это очень нравится. Часто контракт касается того, что объект может сделать для клиента, но здесь он очень четко определяет ответственность клиента. - person Greg; 27.04.2018
comment
@Greg: я видел много статей, в которых предполагается, что неуправляемые ресурсы — это такие вещи, как файлы, дескрипторы GDI и т. д., о которых ОС знает, но живет за пределами GC, но есть некоторые виды ресурсов, такие как подписки на события, которые живут внутри GC, но его нужно очистить, и есть другие, которые включают обещания вещам за пределами компьютера, о которых ОС не может знать. - person supercat; 27.04.2018

Это действительно зависит от того, какой ресурс.

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

Одни ресурсы влияют на другие процессы. Базы данных обычно имеют довольно низкие ограничения на количество подключений (иногда из-за лицензионных ограничений). Если вы не закроете свои подключения должным образом, когда закончите с ними, вы исчерпаете их очень быстро. Кроме того, открытые соединения потребляют ресурсы сервера базы данных, потенциально замедляя работу всех пользователей. Кроме того, такие ресурсы также могут быть невостребованы при завершении процесса, поскольку ОС о них не знает; скорее, соединения могут в конечном итоге истечь по времени на сервере, но это может быть значительно дольше, чем работает ваш процесс.

person Sebastian Redl    schedule 24.04.2018