이번 포스팅은 이펙티브 자바 중 "finalize와 cleaner 사용을 피하라"
입니다.
finalizer와 cleaner는 주로 gc가 일어날 때, 사용한 리소스를 close하기 위해서 사용됩니다.
만약 사용하고 있는 리소스를 반납하지 않는다면, 사용하지 않는 리소스가 메모리를 차지하고 있어 메모리 누수가 발생하게 될 것 입니다.
finalizer는 finalize 메소드를 오버라이드하여(Object 클래스에 있음) gc가 일어날 때 수행됩니다. 자바 9부턴 deprecated 되었고, cleaner를 사용하도록 권장하고 있습니다.
@Override //Object 클래스에 있는 것을 오버라이드
public void finalize() {
// ...
}
public class BigObject {
private List<Object> resource;
public BigObject(List<Object> resource) {
this.resource = resource;
}
// 내부 클래스를 만들고 Runnable을 구현한다.
public static class ResourceCleaner implements Runnable {
private List<Object> resourceToClean;
public ResourceCleaner(List<Object> resourceToClean) {
this.resourceToClean = resourceToClean;
}
//이 부분이 수행된다.
@Override
public void run() {
resourceToClean = null;
System.out.println("cleaned up.");
}
}
}
네이티브 피어란 ,
일반 자바 객체가 네이티브 메서드를 통해 기능을 위임한 네이티브 객체를 말합니다.(자바 클래스 -> 네이티브 메소드 호출 -> 네이티브 객체 (네이티브 Peer))
반납할 자원이 있는 클래스는 AutoCloseable을 구현하고 클라이언트에서 close()를 호출하거나 try-with-resource를 사용해 자동으로 close될 수 있도록 해야합니다.
reference