JVM의 메모리 영역

Method Area (Class Area, Static Area)
- 정적 영역
- static-zone과 none static-zone으로 나뉜다.
- 클래스 코드의 바이트 코드가 로드되는 영역(기계어 코드)
- 프로그램 실행 중 클래스나 인터페이스를 사용하게 되면, JVM은 Class Loader를 이용해 클래스와 인터페이스의 메타데이터를 Method Area에 저장
Stack Area
- 메서드가 호출되면 호출된 기계어 코드가 push되고 실행되는 메모리 공간
- 현재 실행되고있는 상태를 파악할 수 있다.
- 메서드 내부의 지역변수도 stack에 할당됨.
- Heap Area에 저장되는 객체의 참조변수 저장
- PC : 현재 수행중인 프로그램의 위치를 나타낸다.
- LIFO(Last In First Out) 구조
Heap Area
- 프로그램이 실행되면서 동적으로 생성된 객체(인스턴스)가 저장
- stack영역에는 참조변수(인스턴스 변수)만 저장되며 Heap 영역에 실제 데이터가 저장
- Garbage Collector(GC)에 의해 메모리가 수집
static
메인 클래스는 왜 객체 생성 없이 실행될까?
public class StaticTest{
public static void main(string[] args){
System.out.println(“Hello Java”);
}
}

메인 클래스가 실행되는 방식
- JVM이 실행할 클래스를 찾는다. 찾았다면?
- static 키워드가 붙어있는 멤버들을 정해진 메모리(static-zone) 위치에 한번 자동으로 로딩 한다.
- static 키워드가 붙어있는 멤버들은 클래스를 사용하는 시점에서 딱 한번 메모리에 로딩
- JVM이 static zone에서 main()을 호출
- 호출된 메서드를 Call Stack Frame Area(Stack Area)에 push(기계어코드를 넣고) 한 뒤 동작을 시작한다.
none static 메서드 접근 방법

- static-zone에 있는 main()메서드가 먼저 실행되고 Heap Area에 객체를 생성
- 생성된 객체의 hap() 메서드가 none static-zone에 할당되고 Stack Area에 올라옴
요약
- static 멤버는 클래스를 사용하는 시점에서 자동으로 Method Area의 static-zone에 로딩된다.
- 따라서 new로 객체를 생성하지 않아도 호출이 가능하다.
- static 멤버 접근 방법 -> 클래스이름.호출메서드
- none-static 멤버에 접근하기 위해선 객체를 생성해야한다.
- 자주 사용하는 메서드는 static으로 선언하여 객체생성 없이 호출하여 사용할 수 있다.
- 자바 API에는 모든 메서드가 static인 경우 생성자를 private으로 두어 객체생성을 막고있는 클래스도 있다. (System, Math...)
Class, Object, Instance 구분하기
