2009-06-29 6 views
6

안녕하세요, 저는 Java에서 많은 임시 파일을 사용하고 있으며 제 문제는 삭제되지 않는다는 것입니다.가비지 수집을 사용하여 파일을 삭제하는 방법은 무엇입니까?

임시 파일 관리를 직접 처리하지 않고도 (하드가 아니라 허락을 받으면서도 할 일이 많아서이 모든 작업을 효과적으로 수행 할 수 있습니다.) 디스크의 임시 파일이 상당히 규칙적으로 삭제되는지 확인하십시오. 파일을 사용하여 tmp.deleteOnExit()를 말할 수 있지만 파일이 종료되는 유일한 방법은 서비스가 충돌 할 때 (드물게 발생 함) 또는 언제 실행되는지 여부입니다. 시스템이 충돌합니다 (예 : 드라이브가 임시 파일로 가득 차서 클러스터를 무너 뜨릴 때처럼 ...)

생성 된 인스턴스는 가비지 컬렉터에 의해 어느 시점에서 수집되는 것이 가장 이상적입니다. 메모리에서 인스턴스를 참조 해제 할 때 GC가 정리를 마칠 수 있고 실제로 디스크의 파일을 삭제할 수 있다면 응용 프로그램의 유휴 시간은 그냥 멋지다.

내가 볼 수있는 유일한 방법은 File 클래스를 오버로드하고 파이널 라이즈 된 메서드를 추가하는 것입니다 ... 만약 내가 그렇게한다면 내 자신의 임시 파일 관리자와 함께 갈 수도 있습니다!

너무 짧아서 가비지 수집기를 사용하여 시스템 리소스 (예 : 파일)를 정리할 수 있습니까?


답장을 보내 주셔서 감사합니다. 나는 그것을 구현하는 것이 가장 간단하고 결국 내가 한 일인 크리스토퍼의 것을 받아 들였습니다.

나는 오랜 세월 동안 정리 된 것 같아서 기본 관리를 잊어 버렸지 만 C++의 good'ol days에 열심히 할 생각이었습니다.

+1

나는 당신이 당신의 용어를 혼란스럽게 생각합니다. 가비지 컬렉터는 파일이 아닌 메모리 용입니다. –

+0

응용 프로그램 종료에서 실행하려면 원할 경우 가비지 수집이 종료/충돌 (메모리가 해당 시점에 OS에 의해 할당 취소되고 실행되지 않음)로 실행되지 않으므로 무언가를 수동으로 넣어야합니다. 프레임 워크) –

+2

Java에는 소멸자가 없으므로 삭제할 개체를 수집 할 수 없습니다. – lhahne

답변

2

물론 가능합니다. 질문은 당신이 정말로하고 싶은지 여부입니다.

저는 야생에서이 문제를 실제로 경험했습니다. 당신이 알아 차렸 듯이 deleteOnExit()로 임시 파일을 정리하는 것은 응용 프로그램이 아닌 서비스를 실행할 때 쓸모가 없다. 가장 안정적인 솔루션은 프로그램 흐름을 재구성하여 임시 파일이 작업 단위로 생성되고 더 이상 필요하지 않을 때 명시 적으로 삭제된다는 것입니다.

다른 방법으로 실행하는 경우, 즉 프로그램이 실행 중에 임시 파일을 보관하거나 삭제해야하는지 여부를 결정할 수없는 경우 디자인 문제가 발생할 수 있습니다. 일부 관리자 하네스의 파일을 래핑하면 "실제"솔루션이 연기 될 수 있습니다.)

2

당신은 PhantomReference로 볼 수도 있습니다 : 콜렉터 후 큐에 넣어

팬텀 참조 객체가 그렇지 않으면 재생 될 수 있음을 확인합니다. Phantom 참조는 Java finalization 메커니즘에서 가능한 것보다 더 유연한 방식으로 선결제 작업을 예약하는 데 가장 자주 사용됩니다.

+0

예 팬텀 레퍼런스는 GC의 워크 플로우에서 "연결"하여 일부 객체에 개입 할 수있는 곳인 것처럼 보입니다. 그러나 이것을 구현하는 것은 수동으로 관리하는 것보다 더 복잡하고 확실하지 않을 것입니다. 슬리브를 롤업하고 그냥 할 것입니다! – Newtopian

2

클래스가 삭제 될 때 발생하는 이벤트에 의존한다고해서 파일이 남을 수 있습니다.

  • 하는 프로그램이 현재 세션 동안 열려 있었다 모든 파일을 정리 닫을 때에 대한 이벤트 핸들러를 작성 :

    나는 다음과 같이 임시 파일의 정리를 달성하기 위해 가장 간단하고 신뢰할 수있는 방법이라고 생각 .

  • 프로그램을 시작할 때 실행할 절차를 작성하십시오.이 절차는이 폴더에서 24 시간이 넘은 임시 파일을 삭제합니다.

이 방법을 사용하면 어떤 이유로 프로그램이 충돌하고 임시 파일이 남아있을 염려가없고 사용중인 파일을 삭제하는 프로그램에 대해 걱정할 필요가 없습니다.

+0

ACtually 닫기 이벤트가 임시 파일에 대해 무료로 제공됩니다 ... File.deleteOnExit 그냥 여분의 코드없이 ... 문제는 응용 프로그램이 종료되지 않습니다! 적어도이 코드가 영향을 미칠 수있는 것은 아닙니다. 가끔씩 일괄 처리가 삭제됩니다. – Newtopian

1

가비지 수집은 이러한 유형의 정보 처리를위한 잘못된 네임 스페이스입니다.

다음 항목은 임시 파일을 처리하기에 충분해야합니다.

  1. 더 이상 파일을 사용하지 않으면 파일을 삭제하려고 시도해야합니다. finalize 블록이이를 처리 할 수 ​​있습니다.

  2. DeleteOnExit을 사용해야합니다.

  3. 특수 임시 디렉토리에 임시 파일을 만들 수 있습니다. 이 임시 디렉터리는 응용 프로그램이 시작되고 닫힐 때 삭제할 수 있습니다. 응용 프로그램을 닫은 후에 임시 파일이없는 것을 확인하십시오.

+0

1 - finalize가 유용한 것은 GC가 요구하는 클래스에 있어야하기 때문에이 경우 필자는 Java에서 File 클래스를 재정의해야 할 것이다. 2 deleteOnExit이 수행하지 않는다고 명시 적으로 말하면서 이론적으로 프로그램이 종료되지 않습니다 ... 이제까지 3 -... 기본적으로 임시 파일을 직접 처리하는 작업으로 돌아갑니다 ... 내가 배웠습니다. 이 자원을 요구하는 것이 자연 스럽기 때문에 GC는 매우 간단합니다. – Newtopian

0

그럼 가비지 수집시 파일을 삭제하기 위해 finalizer을 사용하는 파일에 대한 래퍼를 만들 수 있습니다.

하지만 파이널 라이저는 예측 가능한 방식으로 호출되지 않으므로 실제로는 권장하지 않습니다.

+0

예, 작동 하겠지만 File 클래스를 확장해야합니다. + 당신과 다른 사람들이 압도적으로 신뢰할만한 것은 아니지만. – Newtopian

0

가비지 수집기는 이러한 종류의 리소스를 무료로 사용할 수있는 곳이 아닙니다. Java에서 자원을 해제하는 방법에 대해서는 아래의 두 기사를 참조하십시오. http://c2.com/cgi/wiki?ReleasingResourcesInJava Java finalizer의 성능 문제. 그들은 어떻게 사용해야하는지에 대한 통찰력과 이해력을 줄 수 있습니다. http://www.enyo.de/fw/notes/java-gc-finalizers.html

+0

좋은 독서. 감사합니다 – Newtopian

+0

그것은 내 기쁨입니다 – Priyank

1

가비지 수집기는 그런 용도로는 유용하지 않습니다. 이것은 메모리 관리를 위해 설계되었으며 많은 단점을 가지고 있습니다.

  • 파일을 더 이상 사용하지 않으면 개체를 오래 수집 할 수 있습니다.
  • 귀하의 개체를 전혀 수집하지 않을 수도 있습니다.

Java가 큰 힙 크기로 시작되면 두 가지 일이 특히 자주 발생합니다. 서버 쪽에서 특이한 작업은 아닙니다.

프로그램의 어떤 지점에서 해당 파일의 스트림을 닫아야합니다. 그렇지 않으면 시스템 파일 핸들을 먹어 버릴 수있어 시스템을 사용할 수 없게 만듭니다. 이미 그렇게했습니다. 스트림을 닫을 때 관련 파일을 삭제할 수도 있습니다. 그것은 가장 깨끗한 방법입니다.

관련 문제