이번 포스팅은 이펙티브 자바 중 "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