Skip to content

모든 객체의 공통 메서드-8 #4

@iamsunk

Description

@iamsunk

finalizer 와 cleaner 의 사용을 피하라

GC는 컨트롤 가능한가?

  • 내가 원할때 소멸시키는가 / 아니다.
  • finalizer의 대안 cleaner 역시 문제가 많다.
  • try with resource(auto closable) vs finalize gc 성능이 50배(12ns vs 550ns) 차이 난다.
  • 그럼 언제 저것들을 쓰고 있나? / 효과있나?
    • 닫지 않은 파일/커넥션등을 아주~늦게 나마 회수해준다.(FileInputStream, ThreadPoolExecutor)
    • 네이티브피어(jni 같이 c 등 다른 언어 메소드를 연결하는 것) 객체(자바 객체가 아니니 알지 못해서) //이
      때는 성능저하가 불가피 할 듯 보이고 close()를 꼭 해야할 것 같다.
  • 이 대안은 그럼 무엇?
    • AutoCloseable을 구현한다.
public class Room implements AutoCloseable {
    private static final Cleaner cleaner = Cleaner.create();

    // 청소가 필요한 자원. 절대 Room을 참조해서는 안 된다!
    private static class State implements Runnable {
        int numJunkPiles; // Number of junk piles in this room

        State(int numJunkPiles) {
            this.numJunkPiles = numJunkPiles;
        }

        // close 메서드나 cleaner가 호출한다.
        @Override public void run() {
            System.out.println("Cleaning room");
            numJunkPiles = 0;
        }
    }

    // 방의 상태. cleanable과 공유한다.
    private final State state;

    // cleanable 객체. 수거 대상이 되면 방을 청소한다.
    private final Cleaner.Cleanable cleanable;

    public Room(int numJunkPiles) {
        state = new State(numJunkPiles);
        cleanable = cleaner.register(this, state);
    }

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions