Каковы последствия утечки ресурсов? - PullRequest
0 голосов
/ 24 апреля 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

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

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

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

0 голосов
/ 24 апреля 2018

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

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

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

...