자바 메모리 구조
- 자바 메모리 구조는 크게 3가지로 나눌 수 있으며 메서드영역 힙영역 스택영역으로 나뉠 수 있다.
- 자바가 실행이 된다면 JVM내부에서 3가지의 메모리 구조로 나뉘어 실행이 된다고 보면 된다.
메서드 영역
- 메서드 영역은 클래스 정보를 보관하는 곳이다. 클래스 정보가 붕어빵 틀이라고 한다.
- 프로그램에 실행되는 공통된 데이터를 관리한다. 그렇기에 프로그램의 모든 영역에 공유가 된다.(아직 잘 이해가 안됨)
- 클래스 정보 : 클래스의 실행코드 바이트코드 필드 메서드 생성자와 같이 모든 실행 코드가 존재한다. 자바가 실행되었을 때 클래스의 정보를 읽고 자바에 올리게 되는데 읽은 정보들을 메서드 영역에 올린다.
- 스태틱 영역 : 스태틱 변수들을 보관한다.
- 런타임 상수 풀 : 리터럴을 여러군대에서 사용하게 되는데 최적화 하기 위해 메서드영역의 상수풀이라는곳에 담아두고 가져와서 쓰는 곳이다.
힙영역
- 실제 붕어빵 틀인 A클래스에서 new를 하여 붕어빵을 생성한다면 생성된 붕어빵은 힙 영역에 인스턴스들이 보관이 된다.
- 정리해서 말자자면 new연산자를 사용한다면 객체가 생성되는 영역이다.
- 배열도 힙 영역에 생성이 되는 영역이며 가비지 컬렉션이 이루어지는 주요 역역이며 더이상 힙영역에서 다른곳에서 참조하지 않는다면 GC가 제거한다.
스택영역
- 메서드를 실행할 때마다 스택영역이 하나씩 쌓이게 된다.
- 메인메서드가 실행이 되고 그 안에서 또 메서드가 실행이 된다면 스택영역에서 메인메서드 그 위해 메서드가 하나씩 쌓이게 된다.
- 자바를 실행할 때 하나의 실행 스택이 생성이 되는데 각 스택 프레임은 지역변수 메서드 호출 정보등을 포함한다.(어떤 메서드인지 어떤 지역변수가 있는지)
- 스택프레임 : 스택 영역에 쌓이는 네모박스가 하나의 스택 프레임이며 하나하나씩 쌓이며 메서드가 호출이 될 때마다 하나씩 쌓이며 메서드 호출이 끝나면 사라진다.
- 스택 영역은 각 쓰레드 별로 하나의 실행 스택이 생성이 된다.
메서드 코드는 메서드 영역에
- 특정 클래스로 생성된 100개의 객체가 힙영역에 보관이 된다. 객체의 내부에는 변수와 메서드를 갖게 되며 같은 클래스에서 생성된 객체라고 하더라도 객체에 때라서 필드값이 달라지게 된다. 하지만 메서드는 공통된 코드를 공유하게 된다.
- 메서드는 전부다 같은 공통 코드를 갖는데 하지만 필드처럼 힙메모리에 생성된 객체에 집어넣으면 상당히 비효율 적이다.
- 메서드는 코드를 공유를 하게 되는데 객체가 생성이 될 때 필드들은 메모리에 할당이 되는데 메서드에 대한 새로운 메모리에 대한 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리되고 실행이 된다.
- 만약 x001.method()라는 코드를 호출하면 메서드를 메서드 영역에서 불러 온다음 호출하게 된다. 메서드 영역에는 클래스 정보가 담긴 실행코드가 존재하게 되는데 여기서 불러오게 된다.
정리 : 객체의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러 수행한다.