인스턴스 변수의 생명주기는 객체를 쓰지 않을 때 라고 한다. '객체를 쓰지 않을 때' 란 언제고, 이를 확인할 수 는 없을까?
객체를 쓰지 않을 때
아직 그 객체를 가리키고 있는 참조변수가 있는지 없는지로 판단을 한다.
만약 누군가 그 객체를 가리키고 있으면 '사용중' 인거고, 아무도 안 가리키면 '안 쓰는 객체' 로 GC(가비지 컬렉터) 정리 대상이 된다.
인스턴스 변수 생명주기 확인하기
public class InstanceLifeCycle {
int instanceVar;
public InstanceLifeCycle() { // 생성자
instanceVar = 10;
System.out.println("인스턴스 변수 생성됨: " + instanceVar);
}
@Override
protected void finalize() throws Throwable { // 객체가 GC로 삭제되기 직전 호출되는 메서드
System.out.println("객체가 사라지면서 인스턴스 변수도 사라진다");
super.finalize();
}
public static void main(String[] args) {
InstanceLifeCycle obj = new InstanceLifeCycle();
System.out.println("인스턴스 변수 상황 : " + obj.instanceVar); // 객체가 살아있어 인스턴스 변수에 접근 가능
obj = null; // 객체를 참조하는 변수를 끊기 = 인스턴스 변수에 접근 불가
System.gc(); // GC 요청(반드시 실행되는 것은 아님)
try {
Thread.sleep(1000); // finalize 메시지 볼 시간 부여
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("프로그램 종료");
// System.out.println("인스턴스 변수 상황 : " + obj.instanceVar); // 에러
}
}
인스턴스 변수 생성됨: 10
인스턴스 변수 상황 : 10
객체가 사라지면서 인스턴스 변수도 사라진다
프로그램 종료
finalize() 메서드
객체가 메모리에서 삭제되기 직전에 자동으로 호출되는 메서드 이다.
자바 9부터는 이 메서드 사용을 지양하고 있다. 이유는언제 호출될지 보장 하지 못하고, 성능에도 영향을 줄 수 있고, 예외 터지면 무시되어서 디버깅에 어려움이 생기기 때문이다.
대신 try-with-resources, try-final 등 과 같은 방법들이 생겼다고 한다. (나중에 이 방법으로 다시 해보겠다.)
ojb = null;
이 객체는 더 이상 사용하지 않는 객체라는 것을 의미한다.
사실 이 코드를 사용하지 않더라도 GC가 자동으로 판단하지만, 이렇게 명시적으로 끊어주면 조금 더 빨리 GC 대상이 될 수 있다.(실무에서는 사용 X)
Thread.sleep(1000) 을 지정하는 이유
프로그램을 1초 동안 잠깐 멈춰달라는 코드이다.
System.gc(); 를 호출하면 GC가 바로 실행되는게 아니라서, GC가 객체를 지우고 finalize() 메서드를 호출할 시간적 여유를 부여하는 것이다.
'TIL' 카테고리의 다른 글
| [25.04.02] TIL - 웹 서버와 웹 어플리케이션 서버의 차이? (0) | 2025.04.03 |
|---|---|
| [25.03.30] TIL - 변수 네이밍 (0) | 2025.03.30 |
| [25.03.28] TIL - 중앙처리장치, 주기억장치, 보조기억장치 란? (0) | 2025.03.28 |
| [25.03.26] TIL - Git Action 버전 불일치 오류 (0) | 2025.03.26 |
| [25.03.13] TIL - MSA 구조에서의 DB 구성 (0) | 2025.03.13 |