[Java] JVM과 가비지 컬렉션

홍건의·2024년 9월 16일
0

Java 정리

목록 보기
5/8

JVM

1) Method Area
클래스에 대한 정보 저장하는 곳. 예를들면 static 붙은 클래스 변수, 메소드

2) Call Stack
호출된 메소드를 위한 메모리 할당. 예를 들면 지역변수, 중간 연산 결과값

3) Heap
실제 instance가 생성되는 공간. 예를 들면 instance 변수

가비지 컬렉션

참조를 다 썼을 때 null 처리를 하면 참조해제 된다. 이럴 때 장점은 NullPointerException을 던지며 종료시킬 수 있다. 프로그램 오류는 가급적 조기에 발견하는게 좋으므로 장점이 될 수 있다.

시스템 성능에 매우 큰 영향을 끼치기 때문에 System.gc()는 절대로 사용하면 안된다. 그리고 Serial GC는 1개의 CPU 코어를 위해 나온 개념이기에 현대에서는 사용하지 않아야 한다.

메모리 누수의 주범들

  • 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다.
  • 캐시도 메모리 누수를 일으키는 주범이다.
  • 리스너(콜백함수) 클라이언트가 콜백을 등록만 하고 명확히 해제하지 않는다면 콜백은 계속 쌓여만 갈 것이다.

finalizer & Cleaner 사용을 피하라

finalizer는 객체가 소멸될 때 호출되기로 한 약속된 메소드이다. deprecated된 API이다. 예측할 수 없고 상황에 따라 위험할 수 있기 때문에 사용하면 안된다. GC에 의해 객체가 회수될 때, 해당 메소드가 호출된다. 즉시 호출된다는 보장이 없기 때문에 문제가 된다. finalize 하는 동안 예외가 catch되지 않으면 해당 예외는 무시된다. cleaner의 경우 finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리고 일반적으로 불필요하다.

비메모리 자원을 회수하는 일은 try-with-resources나 try-finally를 사용해 해결한다.

profile
Backend Developer

0개의 댓글

관련 채용 정보