# Finalizer & Cleaner

## Finalizer

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

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

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

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

## Cleaner

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

```java
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) 에서만 사용하라.

