Finalizer & Cleaner

Finalizer

원래는 GC(Garbage Collection) 대상을 호출하기위해 오버라이딩하던 메서드임. 즉 객체가 없어지기전에 다른 자원들을 잘 정리해주는 의도로 사용하였었음.

@Override
public void finalize() {
    // ...
}

Java 9 에서 해당 메서드는 페기(Deprecated) 되었음. 성능도 별로고 많은 오류도 있고 영원히? 수행되지 않거나 수행되더라도 간혹 Lock 에 걸려 프로그램 자체 먹통되는 경우가 종종 있었다고 함.

그 대체자로 java 9 에서 Cleaner 가 등장하게 되었다고 함.

Cleaner

Cleaner가 더이상 사용되지 않을때 Thread 에서 정의된 clean 작업을 수행.

public class CleaningRequiredObject implements AutoCloseable {

    private static final Cleaner cleaner = Cleaner.create​();

    private static class CleanData implements Runnable {

        @Override
        public void run() {
            // 클린 작업 수행 지점
        }
    }

    private final CleanData;
    private final Cleaner.Cleanable cleanable

    public CleaningRequiredObject() {
        this.cleanData = new CleanData();

        // register
        this.cleanable = cleaner.register(this, state);
    }

    @Override
    public void close() {
        cleanable.clean();
    }
}

결론:

  • Serialize 은 예측불가!수행 지점을 알수 없음.

  • 보안에 취약하다.

  • 대체자 cleaner 도 수행지점을 예측할수 없고 보안역시 취약하다고 한다.

  • 꼭 사용해야 된다면 JNI (java native interface) 에서만 사용하라.

Last updated