2013-08-01 33 views
8

Nhiều lần tôi đã gặp tuyên bố rằng ứng dụng phải luôn đóng tất cả các tài nguyên mà nó đã mở một cách rõ ràng.Việc đóng tài nguyên luôn quan trọng?

Cách tiếp cận lập trình của tôi khá thực dụng và tôi không muốn theo dõi một cách mù quáng bất kỳ quy ước nào mà tôi không thấy rõ lợi ích của. Do đó câu hỏi của tôi.

Giả sử rằng:

  1. Tôi có một ứng dụng nhỏ
  2. Nó mở ra một ít tài nguyên (ví dụ như các file, các kết nối cơ sở dữ liệu, suối từ xa) và xử lý nó
  3. Nó hoạt động một vài phút và sau đó nó thoát
  4. Hãy nói rằng đó là trong Java (nếu ngôn ngữ là có liên quan)

tôi thực sự phải quan tâm đến cl osing tất cả các nguồn lực mà tôi đã mở? Tôi đoán tất cả các tài nguyên tôi đã mở sẽ được đóng/phát hành khi ứng dụng/máy ảo thoát. Tôi có đúng không?

Nếu đó là sự thật, có lý do thuyết phục nào để quan tâm đến việc đóng tài nguyên trong ứng dụng ngắn, ngắn như vậy không?

UPDATE:

Câu hỏi đặt ra là hoàn toàn giả thuyết, nhưng lập luận cho không quan tâm về điều đó là tôi có thể được chỉ hack cùng một số kịch bản nhanh chóng và không muốn viết bất kỳ mã không cần thiết không trực tiếp liên quan cho vấn đề ở bàn tay: đóng tài nguyên, thực hiện tất cả các công cụ cố gắng tiết kiệm chi tiết này, xử lý các ngoại lệ mà tôi không quan tâm, v.v.

Điểm của câu hỏi là liệu có bất kỳ hậu quả nào của thực tế hay không không làm điều đó.

+5

Hãy để tôi trả lời câu hỏi cho bạn: Tại sao bạn không nên ** quan tâm đến việc đóng tài nguyên? –

+1

"đoán tất cả các tài nguyên tôi đã mở sẽ được đóng/giải phóng khi ứng dụng/máy ảo thoát." -> Tôi đoán là điều này không đúng. Nếu bạn không đóng và thoát VM, hệ điều hành có thể chịu trách nhiệm đóng các luồng/ổ cắm đó. – kosa

+3

Để loại bỏ các cảnh báo, bạn phải ngăn chặn chúng mà chỉ là công việc như .close(). Ngoài ra nó là hình thức tốt. –

Trả lời

9

Tôi đoán tất cả tài nguyên tôi đã mở sẽ bị đóng/giải phóng khi ứng dụng/Máy ảo thoát.

Điều gì xảy ra với tài nguyên không được phát hành kỳ lạ nằm ngoài tầm kiểm soát của bạn. Nó có thể không gây hại, hoặc nó có thể làm một số. Nó cũng phụ thuộc vào nền tảng cao, vì vậy việc thử nghiệm trên chỉ một cái sẽ không giúp ích gì.

tại sao tôi nên quan tâm đến việc đóng các tài nguyên này trong ứng dụng ngắn, ngắn như vậy?

Kích thước của ứng dụng không quan trọng. Đầu tiên, các ứng dụng thường phát triển; thứ hai, nếu bạn không thực hành làm đúng cách, bạn sẽ không biết làm thế nào để làm điều đó khi nó quan trọng.

+1

Đóng tài nguyên cần rất nhiều thực hành vì nó thực sự phức tạp [http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ zapl Cảm ơn bạn đã liên kết tuyệt vời! –

2

Câu trả lời ngắn gọn - Có. Đối với một, nó thực hành mã hóa TERRIBLE giống như nó là trong mọi lĩnh vực khác của cuộc sống để không làm sạch sau khi chính mình. Đối với người khác, bạn không thể dự đoán liệu hệ điều hành có nhận ra rằng môi trường java không còn cần tài nguyên nữa và bạn có thể bị khóa trên các tệp/etc không thể được phát hành mà không cần khởi động lại cưỡng bức.

Luôn dọn sạch mọi tài nguyên bạn mở!

Cập nhật liên quan đến cập nhật của bạn đối với câu hỏi gốc - mất 5 giây để thêm khối thử/nắm bắt để đóng mọi tài nguyên mở và có thể ngăn bạn phải dành 5 phút để khởi động lại máy tính của mình. Làm đúng nó luôn tiết kiệm thời gian cuối cùng. Bố tôi luôn nói với tôi rằng người lười biếng thực sự làm những việc đúng ngay từ đầu nên họ không phải quay lại và làm lại lần nữa. Tôi chỉ nói đừng lười biếng và làm đúng. 5 giây nó cần để viết một khối catch sẽ không bao giờ làm chậm quá trình viết đáng kể ... 5 giây bạn tiết kiệm bằng cách không viết nó có thể làm chậm quá trình gỡ lỗi của bạn vô cùng.

+1

"giống như trong mọi lĩnh vực khác của cuộc sống không được dọn sạch sau khi bạn", cũng nói! –

+2

Cảm ơn, bạn đã thực hiện một số điểm tốt. Nó không thực sự là tôi rất lười biếng. Tôi đóng tài nguyên trong mã của mình. Nó chỉ là tôi không thích tiên đề và làm mọi thứ "bởi vì mọi người đều làm điều đó". Đó là lý do tại sao tôi cố tình xây dựng câu hỏi gây tranh cãi đó. Và nó không chỉ 5 giây mà bạn đề cập đến mà tôi không thích nhưng mã tiết và khá xấu xí được yêu cầu trong Java. Chúng tôi chắc chắn cần chuyển sang Java7 để giới thiệu các tài nguyên thử. –

+0

Tôi chưa chơi với tính năng "thử với tài nguyên" mới trong Java 7, nhưng ở đó tôi đồng ý với bạn :) – StormeHawke

5

Nếu bạn không đóng các nguồn lực, có thể dẫn đến các máy chủ ứng dụng đang được thường xuyên khởi động lại khi cạn kiệt tài nguyên occurs.because hệ điều hành và máy chủ ứng dụng thường có một giới hạn trên-bound cho nguồn

Theo docs

Ứng dụng Java điển hình xử lý một số loại tài nguyên như tệp, luồng, ổ cắm và kết nối cơ sở dữ liệu. Tài nguyên phải được xử lý cẩn thận, vì chúng có được tài nguyên hệ thống cho lần thứ eir hoạt động. Do đó, bạn cần đảm bảo rằng chúng được giải phóng ngay cả trong trường hợp lỗi.

Trên thực tế, quản lý tài nguyên không chính xác là một nguồn phổ biến của những thất bại trong ứng dụng sản xuất, với những cạm bẫy thông thường là các kết nối cơ sở dữ liệu và mô tả tập tin còn lại mở sau khi một ngoại lệ đã xảy ra ở một nơi khác trong code.Điều này dẫn đến các máy chủ ứng dụng thường xuyên được khởi động lại khi cạn kiệt tài nguyên, bởi vì các hệ điều hành và máy chủ các ứng dụng thường có giới hạn trên tài nguyên.

try-with-resources Tuyên bố được giới thiệu trong java 7 dành cho các lập trình viên ghét những phát biểu gần đúng.

+1

+1 Mẹo hay về 'thử nghiệm với tài nguyên'. Bị mắc kẹt trong thời đại đen tối của Java 5, tôi không biết về sự tồn tại của nó. – splungebob

Các vấn đề liên quan