finalize 메소드
프로그래머가 호출하는 메소드가 아니다. 인스턴스 소멸 시 자동으로 호출된다.
GC(가비지 컬렉션)는 자주 해줘야 할까?
GC을 자주하면 프로그램 실행 속도가 느려지기 때문에 자주 GC하지 않는다.
GC의 2단계
1. JVM이 힙을 스캔하면서 GC 대상의 인스턴스들을 확인한다.
2. 확인 후, JVM은 인스턴스를 바로 소멸시키지 않고, 잠시 프로그램에 CPU할당을 양보한다. 여유가 생기면 체크한 인스턴스들을 소멸시킨다.
주의!
finalize 메소드는 GC의 2단계에서 호출된다.
GC하는 이유는?
GC는 프로그램을 지속적으로 운영하기 위해서 반드시 필요하다. 프로그램이 동작하는데 메모리 공간이 없으면 안되기 때문에 힙이라는 메모리 공간을 여유가 있을 때마다 비워주는 것이다.
finalize() 선언
finalize() 는 Object 클래스의 메소드이므로, 임의의 클래스(Object의 하위 클래스)에 finalize() 선언하는 것은 곧 Object의 finalize()를 오버라이딩(재정의)을 의미한다. Object는 시스템과 연관이 있는 클래스이므로 finalize()을 재정의해서 기존의 Object의 finalize()가 호출되지 않으면 문제가 생길 수 있다. 이를 해결하기 위해 끼워넣기 오버라이딩을 이용한다.
finalize()는 선언만 하면 항상 호출될까?
아니다. GC를 굳이 할 필요가 없는 상황도 있다. 대표적으로 프로그램 종료할 때 필요 없다. 위의 예제 코드를 보자. 앞서 GC가 필요한 이유는 프로그램을 계속 운영하기 위해서는 메모리가 꽉 차면 안되기 때문이라고 했다. 위의 예제에서는 프로그램 종료될 때까지 메모리 여유가 있기 때문에 GC가 실행되지 않는 상황이다. 그래서 finalize()도 호출되지 않는다. 그리고 프로그램 종료 시, 모든 영역(메소드, 스택, 힙)이 소멸되기 때문에 GC가 필요없다. 이렇듯이 finalize()을 선언하더라도 호출이 안될 수 있기 때문에 잘 사용하지 않는다.
'Programming > Java' 카테고리의 다른 글
JAVA 19(4) clone 메소드 (0) | 2021.08.05 |
---|---|
JAVA 19(3) equals 메소드 (0) | 2021.08.05 |
JAVA 19(1) 메모리 모델 (0) | 2021.08.05 |
JAVA 18(2) 예외 클래스 Throwable (0) | 2021.08.05 |
JAVA 18(1) 예외처리의 기본 (0) | 2021.08.05 |