자바 메모리 구조
자바의 메모리 구조는 크게 메서드 영역,스택 영역,힙 영역 3개로 나눌 수 있다.
왜 메모리 구조가 나눠져 있을까?
메모리를 나누어 관리함으로써 다른 영역에 할당된 데이터가 잘못된 접근으로 인해 다른 영역을 손상시키는 것을 방지할 수 있다. 예를 들어, 스택 메모리는 각 스레드에 대해 별도로 할당되며, 스레드 간의 데이터 공유를 방지하고 스레드 간의 메모리 보호를 제공할 수 있는 것이다.
즉, 메모리 구조를 나눔으로써 각각 나눠진 메모리에는 그에 맞는 역할과 책임이 있으므로 어떤 일이 발생했을 떄, 그 일을 해결할 수 있는 역할을 하는 메모리에 접근하면 되는 것이다.
메서드 영역
메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.
스택 영역
자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과 , 메서드 호출 정보들을 포함한다. 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이 생성된다.
힙 영역
객체와 배열이 생성되는 영역이다. 가비지 컬렉션이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.
메서드 코드는 메서드 영역에!
자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에는 100개의 인스턴스가 생긴다. 각각의 인스턴스는 내부에 변수와 메서드를 가진다. 같은 클래스로부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만, 메서드는 공통된 코드를 공유한다. 따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
즉, 인스턴스의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러서 수행한다!