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