# 클래스

  • 멤버 변수, 필드는 모두 클래스에 소속된 변수를 나타내는 용어이다.
  • 클래스 타입 기반으로 생성된 객체 변수에는 객체의 참조값이 저장된다.
  • 클래스 타입 배열은 null값으로 초기화된다.
    • Student[] students = new Student[2];
  • 멤버 변수는 숫자의 경우 0, 불리언은 false, 참조형은 null을 디폴트값으로 초기화된다.
  • 참조 타입이 메서드 아규먼트로 사용되는 경우 참조가 복사되어 외부 스코프에 위치하고 있는 객체의 멤버에도 영향을 미친다.
  • 자바는 JVM이 GC(가비지 컬렉션) 기반으로 더 이상 참조하지 않는 객체를 메모리에서 제거한다.
void main() {
    Student me = new Student();
    me.name = "gyeongjun";
    me.age = 1;
    me.grade = 2;

    System.out.println(me.name + me.age + me.grade);
}

public class Student {
    String name;
    int age;
    int grade;
}

# 가비지 컬렉션

가비지 컬렉션은 힙 영역에 할당된 객체들을 모아 정리하는 프로세스이다. 가비지 컬렉션 수행 시 stop-the-world가 발생하는데, 이는 GC를 실행하는 스레드 외에 나머지 모든 스레드가 모든 작업을 멈추는 것을 의미한다.

어떠한 GC 알고리즘을 사용하더라도 stop-the-world는 발생하지만, GC튜닝을 통해 stop-the-world 시간을 줄일 수는 있다.

자바에서는 System.gc()를 통해 명시적으로 GC를 수행할 수는 있지만 성능에 매우 큰 오버헤드를 주므로 사용하지 않아야 한다.

GC는 Weak Generational Hypothesis 가설 위에서 만들어졌다.

  • 대부분의 객체는 금방 접근 불가능 unreachable 상태가 된다.
  • 오래된 객체에서 젊은 객체로의 참조가 있는 경우는 매우 드물다.

이러한 가설을 살리기 위해 VM에서는 Young Generation과 Old Generation 이라는 구조로 논리적 공간으로써 나누어 객체를 관리한다.

  • Young 영역: 새로 생성한 객체 대부분이 이곳에 위치한다. 대부분이 객체가 이 영역에 생성되었다가 사라지고, 이 영역에서 사라질때 Minor GC가 발생한다고 표현한다.
  • Old 영역: 접근 불가능 상태로 변경되지 않아 Young 영역에서 살아남은 객체가 Old 영역으로 복사된다. 이 영역에서 객체가 사라질때 Major GC(Full GC)가 발생한다고 표현한다.

특정 객체가 unreachable 상태가 되면 GC를 수행하기에 Eligible한 상태가 된다. 이러한 상태는 개발자가 코드 상으로 적절히 구현해주어야 한다.

  1. 참조 변수를 null처리
  2. 기존 참조하던 참조 변수에 새 객체의 참조를 할당
  3. 메서드 내에서 생성된 객체 (스택 해제 후 unreachable)
  4. Island of Isolation: 객체가 서로 참조를 하고 있지만, 이 객체들 모두 다른 reachable한 상태의 외부 객체로부터 참조되고 있지 않을때를 말함

# Reference

  1. Naver D2 - Garbage Collection (opens new window)