본문 바로가기

java

[Effective java] Item 7 - 종료자(finalize) 사용을 피하라

 

* finalize 는 어떤 클래스든 오버라이드 하여 사용 가능한 기능이다.

public class FiinalIzerExample {
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
}

 

 

왜 문제가 생기는지?

 

하지만 종료자(finalizer)는 예측 불가능 하며, 대체로 위험하고, 일반적으로 불필요하다.

종료자는 GC 에 의해 실행되는데 GC에서 종료자 스레드가 종료 우선순위가 높지 않다면 혹은 다른 이유로 즉시 실행 되리라는 보장이 전혀 없기 때문이다. 또한 종료자를 사용하면 프로그램 성능이 심각하게 떨어진다. 

 

 

* 현재 자바9 에서는 finalizer 가 deprecated가 되었다고 한다. 'Cleaner' 라는게 새로 생겨서 Finalizer 보다 덜 위험하지만별도의 쓰레드를 사용하니까), 여전히 예측 불가능 하며, 일반적으로 불필요 하다고 말한다. (백기선 강의)

 

어떤 문제가 생기는지?

 

github.com/keesun/study/blob/master/effective-java/item8.md

 

keesun/study

Learn, Share and Grow. Contribute to keesun/study development by creating an account on GitHub.

github.com

 

 

 

#. 긴급한(Time-Creitical) 작업을 종료자 안에서 처리 할 경우. 

 에를 들어, 종료자 안에서 파일을 닫도록 할 경우 치명적이다. 파일(file descriptor) 은 유한한 자원이기 때문이다. JVM 은 종료자를 천천히 실행 하므로 열린 상태의 파일이 많이 남아있을 수 있다. 그런 상황에서 새로운 파일을 열려 하면, 한번에 열수 있는 파일의 개수에 제한이 있으므로 오류가 나게된다. 

 

stackoverflow.com/questions/2936155/java-file-write-on-finalize-method

 

Java: file write on finalize method

In my understanding a singleton object will destroy only when the application is about to terminate. So in C++ I write a Singleton class to log my application and in that Singleton logger's destruc...

stackoverflow.com

 

#. finaizer 공격이라는 심각한 보안이슈.

 

 다른 클래스는 finalize() 메소드에  'final' 키워드를 사용해서 상속해서 오버라이딩 하는것을 막을수 있다.  

 

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=508390&ref=508371

blog.naver.com/hhhhhongse/221798617689

 

 

 

어떻게 대체 하는지? 

 

# 자원반납은 AutoCloseable 과 Try-With-Resource 를 사용한다.

 

 

Eternity's Chit-Chat : Resource Release Patterns

시스템 리소스의 사용이 완료된 후 해제 되었음을 보장하기 위해서는 어떻게 해야 하는가? 시스템의 자원은 유한하다. 동시에 열 수 있는 파일의 수, 스레드의 최대 수, 데이터베이스 컨넥션 풀

aeternum.egloos.com

 

 

그래도 어떤 경우에 사용될수 있는지?

 

1) 안전망 역할로 자원을 반납하고자 하는경우

  

2) 네이티브 리소스를 정리 해야하는경우 

 

 

 

 

 

 

반응형