# 클래스
- 멤버 변수, 필드는 모두 클래스에 소속된 변수를 나타내는 용어이다.
- 클래스 타입 기반으로 생성된 객체 변수에는 객체의 참조값이 저장된다.
- 클래스 타입 배열은
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한 상태가 된다. 이러한 상태는 개발자가 코드 상으로 적절히 구현해주어야 한다.
- 참조 변수를 null처리
- 기존 참조하던 참조 변수에 새 객체의 참조를 할당
- 메서드 내에서 생성된 객체 (스택 해제 후 unreachable)
- Island of Isolation: 객체가 서로 참조를 하고 있지만, 이 객체들 모두 다른 reachable한 상태의 외부 객체로부터 참조되고 있지 않을때를 말함
# Reference
← 자바 기초 LLDB - 기초 세팅 →