📕 Today I Learned - 오늘 내가 공부한 것을 정리합니다.
자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다.
메서드 영역: 프로그램을 실행하는데 필요한 공통 데이터 관리, 프로그램의 모든 영역에서 공유스택 영역: 자바 실행 시, 하나의 실행 스택 생성. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함 힙 영역: 객체(인스턴스)와 배열이 생성되는 영역. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거💡 참고: 스택 영역은 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이 생성된다.
각각의 인스턴스는 내부에 변수와 메서드를 가진다.
같은 클래스로 부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만, 메서드는 공통된 코드를 공유한다. 따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다.
→ 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
메서드 호출과 지역 변수(매개변수 포함)를 관리하는 영역
스택 영역의 메서드에서 클래스의 인스턴스를 생성하는 순간 힙 영역에 해당 클래스의 인스턴스를 생성한다. 그리고 참조값을 스택 영역의 지역 변수에 보관한다. 스택 영역의 메서드가 종료되어 스택 프레임이 제거되고 참조값을 보관한 지역 변수도 함께 제거된다.
이 때, 프로그램에서 더 이상 참조하는 곳이 없다면 GC(가비지 컬렉션)이 해당 인스턴스를 찾아 메모리에서 제거한다.
힙 영역에 생성되는 인스턴스 변수는 동적(dynamic)으로 생성되고, 제거된다. 반면에 static 인 정적 변수는 거의 프로그램 실행 시점에 딱 만들어지고, 프로그램 종료 시점에 제거된다. 정적 변수는 이름 그대로 정적이다.
static 변수: 메서드 영역의 static 영역. 클래스를 통해 접근int value = Data.value;
인스턴스 변수: 힙 영역. 인스턴스를 생성하여 인스턴스를 통해 접근Data data = new Data();
int value = data.value;
main() 메서드는 프로그램을 시작하는 시작점이 되는데 객체를 생성하지 않아도 작동하는 이유는 main() 메서드가 static 이기 때문이다.
public static void main(String[] args) {}
→ 정적 메서드인 main() 메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용
💭 혈당 스파이크가 심하게 와서 공부에 방해되었다.😪 롱런할 수 있도록 식습관에도 주의를 기울여야겠다.