JVM이 클래스 변수, 지역변수 등 여러가지 데이터들을 어디에 저장하고 관리하는지에 대해 공부하고 한번 정리해 보려고 합니다.
필자가 바라보는 JVM은 엄청 특별한 프로그램처럼 여겨져서 운영체제도 다르게 관리할까 하는 생각이 문득 들었었는데, 운영체제 입장에서는 그냥 수많은 프로그램중 하나로 관리한다고 합니다.
예를들어 메모장과 JVM이 같이 돌아가더라도 운영체제는 프로세스1 프로세스2 정도로만 구분하여 실행합니다.
필자의 생각은 하나에서 다 처리한다 였습니다. 그러나 JVM은 자바 프로그램이 바이트 코드로 컴파일 되어 실행하는 과정에 각각 하나씩 생성되어 두개의 프로그램이 돌아간다면 두개의 JVM이 실행된다고 합니다. (프로그램 하나마다 담당해주는 매니저가 존재하는 느낌?)
자바 가상 머신(JVM) 의 메모리 구조는 위와 같이 세가지 구역으로 나누어집니다.
- 메소드 영역
- 힙 영역
- 스택 영역
메소드 영역
메소드의 바이트 코드가 올라가는 영역입니다. 자바파일을 컴파일 하면 바이트 코드로 이루어진 .class 파일이 생기고, 이러한 바이트 코드와 스태틱 변수가 저장되는 영역이 메소드 영역입니다.
메소드 영역은 한번 메모리에 할당되면 프로그램이 종료될 때까지 사라지지 않습니다.
힙 영역
객체의 인스턴스가 저장되는 영역입니다.
가비지 컬렉션의 대상이 되는 영역이기도 합니다.
힙 영역이 존재하기에 여러개의 참조변수가 하나의 인스턴스를 참조할 수 있습니다. 객체의 인스턴스는 힙 영역에서 관리하기에 스택영역의 참조변수들이 호출되었던 메소드가 종료되어 소멸 하더라도 객체의 인스턴스는 영향을 받지 않습니다.
인스턴스는 여러 참조변수가 참조하고 있을 수 있기에 아무도 자신을 참조하지 않는다는 확신이 있을 경우에만 삭제해야 합니다. 이렇게 인스턴스를 삭제시키기 위해 JVM 내부에서 자체적으로 가비지 컬렉션 을 실행합니다.
가비지 컬렉션이란 ❓❓ : [Java] 가비지 컬렉션
스택 영역
지역변수, 매개변수들이 할당되는 영역입니다. 변수가 선언된 메소드가 종료된다면 그와 동시에 소멸하는 영역입니다.