DevBoi

[Java] finalize 메서드 사용 및 메모리 점유 본문

Language/[Java]

[Java] finalize 메서드 사용 및 메모리 점유

HiSmith 2022. 4. 28. 13:27
반응형

모든 자바 클래스의 최상위 부모 클래스는 Object클래스이고, finalize메소드가 존재한다.

Java API에는 이 메소드는 가비지 컬렉터가 레퍼런스를 잃은 클래스의 인스턴스를 가비지 컬렉션할 때 호출한다.

이 메소드는 객체 인스턴스가 가비지 콜렉션에 의해 소멸되는 시점에 특정한 동작을 수행해야할때도 요긴하게 사용할 수 있는 메소드이다.

 

GC발생시에 즉각적으로 Collection되지 않는다. Finalize가 선언되어있으면, Finalization Queue에 들어간 후, Finalizer에 의해 정리가 된다.

finalize 메소드를 수행하는데 오래걸리면, 그만큼 객체가 오랫동안 메모리를 점유하게 되고, 이는 OOM이 발생확률이 높아진다.

 

대부분 종료자의 주요목적은 메모리에서 제거되기 전에 개체에서 사용하는 리소스를 해제하는 것이다.

 

종료 자 단점

-정리 작업 수행전에 리소스가 부족할 수 있고, 이로인해 시스템 충돌이 발생할 수있다.

-객체 생성 시점보다, 삭제 큐에 넣고, 삭제작업을 진행하는 , Finalizer스레드가 이 생성 속도를 따라갈수 없게된다면

결국 OOM이 발생하게 된다.

-삭제 큐에 넣고 다음 GC때 삭제한다. 또한 실제 JVM은 객체를 메모리에서 해제하는데 더 많은 작업을 수행한다.

따라서 Finalize메소드를 재구현하게 되면, 최적화, 성능이슈 발생 -> Finalize 스레드가 더 느려지고

이는 객체생성속도 보다 더 느려져서, OOM발생확률이 높게된다.

반응형

'Language > [Java]' 카테고리의 다른 글

[java] war파일 jar파일 비교  (0) 2022.05.01
[Java] Static이란?  (0) 2022.04.28
[Effective Java] Rules  (0) 2022.04.21
[Java] 모니터  (0) 2022.04.08
[Java] 문맥 교환  (0) 2022.04.08