2013-08-01 14 views
8

Wiele razy spotkałem się z oświadczeniem, że aplikacja powinna zawsze jawnie zamykać wszystkie zasoby, które otworzyła.Czy zamknięcie zasobów jest zawsze ważne?

Moje podejście do programowania jest raczej pragmatyczne i nie lubię ślepo podążać za konwencją, której nie dostrzegam. Stąd moje pytanie.

Załóżmy, że:

  1. Mam małą aplikację
  2. otwiera niewiele zasobów (np plików, połączenia z bazą danych, zdalny strumienie) i przetwarza go
  3. Działa kilka minut, a następnie wysuwanego
  4. Powiedzmy to w Javie (jeśli język jest istotne)

Czy naprawdę muszę dbać o cl osing wszystkie zasoby, które otworzyłem? Domyślam się, że wszystkie zasoby, które otwieram, zostaną zamknięte/zwolnione po wyjściu aplikacji/maszyny wirtualnej. Czy mam rację?

Jeśli to prawda, czy istnieją przekonujące powody, aby dbać o zamykanie zasobów w tak małej, krótkiej aplikacji?

UPDATE:

pytanie jest czysto hipotetyczne, ale argument dla nie dbając o to, że mogę być po prostu hacking razem niektóre szybkie skrypt i nie chce pisać niepotrzebnego kodu nie związane bezpośrednio do problemu: zamykanie zasobów, robienie tych wszystkich gadatliwych rzeczy, próbowanie chwytania, obsługa wyjątków, na których mi nie zależy itd.

Pytanie brzmi, czy są jakieś praktyczne konsekwencje nie robię tego.

+5

Pozwolę sobie odpowiedzieć na pytanie: dlaczego ** nie powinniście dbać o zamykanie zasobów? –

+1

"Domyślam się, że wszystkie zasoby, które otworzyłem, zostaną zamknięte/zwolnione, gdy aplikacja/maszyna wirtualna zostanie zamknięta." -> Zgaduję, że to nie jest prawda. Jeśli nie zamkniesz i maszyny wirtualne zostaną zamknięte, system operacyjny może zostać odpowiedzialny za zamknięcie tych strumieni/gniazd. – kosa

+3

Aby pozbyć się ostrzeżeń, musielibyśmy je zignorować, co jest równoznaczne z pracą .close(). Również jest to dobra forma. –

Odpowiedz

9

Podejrzewam, że wszystkie zasoby, które otwieram, zostaną zamknięte/zwolnione po wyjściu aplikacji/maszyny wirtualnej.

Co dzieje się z zasobem, który nie został wydany regularnie, jest poza kontrolą. Może to nie zaszkodzić, lub może to zrobić. Jest to również wysoce zależne od platformy, więc testowanie tylko jednego nie pomoże.

dlaczego powinienem dbać o zamykanie tych zasobów w tak małej, działającej aplikacji?

Wielkość aplikacji nie powinna mieć znaczenia. Po pierwsze, aplikacje zwykle rosną; po drugie, jeśli nie ćwiczysz tego we właściwy sposób, nie będziesz wiedział, jak to zrobić, kiedy ma to znaczenie.

+1

Zamknięcie zasobów wymaga wielu ćwiczeń, ponieważ jest to [naprawdę trudne] (http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ zapl Dzięki za świetny link! –

2

Krótka odpowiedź - Tak. Po pierwsze, jest to przerażająca praktyka kodowania, tak jak w każdej innej dziedzinie życia, aby nie posprzątać po sobie. Po drugie, nie można przewidzieć, czy system operacyjny rozpozna, że ​​środowisko java nie potrzebuje już zasobów, i że może się zdarzyć, że zablokuje pliki/etc, które nie mogą zostać zwolnione bez wymuszonego restartu.

Zawsze czyść wszystkie otwarte zasoby!

Aktualizacja dotycząca aktualizacji pierwotnego pytania - dodanie 5-sekundowego bloku try/catch w celu zamknięcia wszystkich otwartych zasobów i może uniemożliwić ponowne uruchomienie komputera przez 5 minut. Robienie tego zawsze zawsze oszczędza czas. Mój tata zawsze mówił mi, że prawdziwa leniwa osoba robi wszystko dobrze po raz pierwszy, więc nie muszą wracać i robić tego ponownie. Mówię tylko, nie bądź leniwy i rób to dobrze. 5 sekund, które trzeba poświęcić na napisanie bloku catch, nigdy nie spowolni procesu pisania ... 5 sekund, które zapiszesz, nie zapisując go, może znacznie spowolnić debugowanie.

+1

"tak jak w każdej innej dziedzinie życia, aby nie sprzątać po sobie", dobrze powiedziane! –

+2

Dzięki, zrobiłeś kilka dobrych punktów. To nie tak, że jestem taki leniwy. Robię blisko zasoby w moim kodzie. Po prostu nie lubię aksjomatów i robienia rzeczy "ponieważ każdy to robi". Właśnie dlatego celowo sformułowałem tak kontrowersyjne pytanie. I nie chodzi tylko o te 5 sekund wspomniane przez ciebie, że nie lubię, ale wulgarny i dość brzydki kod wymagany w Javie. Zdecydowanie musimy przejść na Java7, która wprowadziła try-with-resources. –

+0

Nie grałem jeszcze z nową funkcją "spróbuj z zasobami" w Javie 7, ale zgadzam się z tobą :) – StormeHawke

5

Jeśli nie zamykać zasobów, które maja prowadzi do serwerów aplikacji jest często wznowiona gdy wyczerpanie zasobu occurs.because systemów operacyjnych i aplikacji serwerowych generalnie mają górną granicę związany zasobów

Według docs

typowa aplikacja Java manipuluje kilka rodzajów zasobów, takich jak plików, strumieni, gniazd i zasobów connections.Such baza danych musi być traktowane z dużą ostrożnością, ponieważ nabyć zasobów systemowych dla th eir operations.Tak więc, musisz upewnić się, że zostaną uwolnieni nawet w przypadku błędów.

Rzeczywiście, nieprawidłowe zarządzanie zasobami jest częstym źródłem niepowodzeń w zastosowań produkcyjnych, z pułapek, zwykle będąc połączenia bazodanowe i deskryptory plików pozostała otwarta po wyjątek wystąpił gdzieś indziej kod. Prowadzi to do częstego restartowania serwerów aplikacji po wyczerpaniu zasobów, ponieważ systemy operacyjne i aplikacje serwera mają zwykle górny limit zasobów.

try-with-resources komunikat wprowadzony w Java 7 dla programistów, który nienawidzi bliskie oświadczenia.

+1

+1 Dobra wskazówka na temat 'try-with-resources'. Utknąłem w Dark Ages of Java 5, byłem nieświadomy jego istnienia. – splungebob

Powiązane problemy