2013-08-01 2 views
8

여러 번 나는 응용 프로그램이 항상 열려있는 모든 리소스를 명시 적으로 닫아야한다는 내용을 만났습니다.리소스를 항상 닫는 것이 중요합니까?

프로그래밍에 대한 나의 접근 방식은 다소 실용적이며 분명히 이점을 볼 수없는 관습을 맹목적으로 따르는 것을 좋아하지 않습니다. 그러므로 내 질문.

의 그런 가정 해 봅시다 :

  1. 내가 그것은 몇 가지 자원 (예 : 파일, 데이터베이스 연결, 원격 스트림)를 열고이를 처리
  2. 작은 응용 프로그램을 가지고 그런 다음 몇 분을 작동
  3. 그것은 종료
  4. (언어 관련이있는 경우)의는

것은 정말 CL 걱정해야합니까는 자바의 가정 해 봅시다 내가 열어 놓은 모든 자원을 osing? 응용 프로그램/가상 컴퓨터가 종료 될 때 열려있는 모든 리소스가 닫히거나 해제 될 것입니다. 내가 맞습니까?

사실, 작고 짧은 작업 응용 프로그램에서 리소스를 닫는 데 신경을 쓰는 확실한 이유가 있습니까?

UPDATE :

문제는 순전히 가정이지만, 그것에 대해을 배려하지 않는 인수가 난 그냥 몇 가지 빠른 스크립트 함께 해킹 할 수 있으며, 직접 관련이없는 불필요한 코드를 작성하지 않을 것입니다 손의 문제 : 나는 걱정하지 않는다 예외를 처리, 자원을 닫는 모든 자세한 시도 - 캐치 마지막으로 물건을 등

질문의 요점은 어떤 실제 결과가 있는지 여부입니다 하지 마라.

+5

질문에 대답 해주십시오 : 리소스를 닫지 않는 이유는 무엇입니까 **? –

+1

"응용 프로그램/가상 컴퓨터가 종료 될 때 열어 본 모든 리소스가 닫히거나 해제 될 것으로 추측합니다." 내 생각 엔이게 사실이 아니야. VM을 닫지 않고 VM을 종료하면 OS가 해당 스트림/소켓을 닫아야 할 수 있습니다. – kosa

+3

경고를 없애기 위해서는 .close()와 마찬가지로 많은 작업을하지 않아야합니다. 또한 좋은 형태입니다. –

답변

9

내가 열어 본 모든 리소스는 응용 프로그램/가상 컴퓨터가 종료 될 때 닫히거나 해제 될 것입니다.

regurarly release되지 않은 리소스는 사용자의 통제를 벗어납니다. 해를 끼치 지 않을 수도 있고, 해를 끼칠 수도 있습니다. 또한 플랫폼 의존도가 높기 때문에 테스트만으로는 도움이되지 않습니다.

이러한 작고 짧은 작업 응용 프로그램에서 이러한 리소스를 닫아야하는 이유는 무엇입니까?

응용 프로그램의 크기는 중요하지 않습니다. 첫째, 응용 프로그램은 일반적으로 커집니다. 둘째, 올바른 방법으로 연습하지 않으면 문제가 될 때 어떻게해야할지 모를 것입니다.

+1

자원 폐쇄는 [매우 까다 롭기 때문에] 많은 연습이 필요합니다. (http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ 좋은 링크 주셔서 감사합니다! –

2

짧은 대답 - 예. 하나는 자신의 일을 정리하지 않는 삶의 다른 모든 영역에서와 마찬가지로 테리 코딩 연습입니다. 또 하나의 이유는 운영체제가 자바 환경이 더 이상 자원을 필요로하지 않는다는 사실을 예측할 수 없으며 강제 재시작없이 풀어 낼 수없는/etc 파일에 대한 잠금을 끝낼 수 있다는 것입니다.

열어 두는 자원은 항상 정리하십시오!

원래 질문에 대한 업데이트 관련 업데이트 - 열려있는 모든 리소스를 닫는 데 try/catch 블록을 추가하는 데 5 초가 걸리고 컴퓨터를 다시 시작하는 데 5 분을 소비하지 않아도됩니다. 그것을 올바르게하면 결국 시간이 절약됩니다. 우리 아빠는 항상 진정한 게으른 사람이 처음부터 제대로 돌아가므로 다시 돌아와 다시 할 필요가 없다고 말했습니다. 나는 게으르지 말고 올바르게해라. catch 블록을 작성하는 데 5 초가 걸리므로 작성 프로세스가 크게 느려지지 않습니다 ... 5 초를 저장하지 않으면 디버깅 속도가 크게 느려질 수 있습니다. 당신은 자원을 닫을 경우

+1

"인생의 다른 모든 영역에있는 것처럼 자신을 정화하지 말라", 잘 말했습니다! –

+2

감사합니다. 좋은 지적을했습니다. 정말 게으른 게 아니에요. 내 코드에서 리소스를 닫습니다. 그것은 단지 공리가 마음에 들지 않으며 모든 일을하기 때문에 일을하는 것입니다. 그래서 나는 논쟁적인 질문을 고의로 공식화했다. 그리고 내가 싫어하지만 Java에서 코드가 필요하고 오히려 못생긴 코드는 여러분이 언급 한 5 초가 아닙니다. try-with-resources를 도입 한 Java7로 전환해야합니다. –

+0

아직 Java 7의 새로운 "자원으로 시도"기능을 사용하지는 않았지만 거기에 동의합니다. – StormeHawke

5

, 즉 5 월은 자주 다시 시작되는 응용 프로그램 서버로 연결 자원 운영 체제 occurs.because 고갈 및 서버 응용 프로그램은 일반적으로 docs

에 따르면 자원

에 대한 상한선 제한이있을 때

전형적인 Java 응용 프로그램은 같은 파일과 같은 자원의 여러 종류를 조작, 소켓 스트림, 그들이 일을 위해 시스템 자원을 획득하기 때문에 데이터베이스 connections.Such 자원 는 신중하게 취급해야합니다 eir 작업입니다. 따라서 오류가 발생하더라도 해지 될 수 있도록해야합니다.

실제로

는 잘못된 자원 관리는 일반적인 함정 예외가 다른 곳에서 발생한 후 열어 남아있는 데이터베이스 연결 및 파일 기술자 인 상태 생산 애플리케이션에서 오류의 일반적인 원인이다 이는 운영 체제 및 서버 응용 프로그램이 일반적으로 리소스에 대한 상한 제한을 가지고 있기 때문에 자원 고갈이 발생할 때 응용 프로그램 서버가 자주 다시 시작되도록합니다 ( ). 가까운 문을 미워 프로그래머를위한 자바 7에서 소개

try-with-resources 문.

+1

+1'try-with-resources'에 대한 좋은 팁. 자바 5의 암흑기에 빠지면서 나는 그 존재를 알지 못했다. – splungebob

관련 문제