Java의 메모리 구조

yun yun·2021년 8월 2일
0

JVM은 OS로부터 메모리를 할당 받는다. 그리고 할당 받은 공간을 ‘Runtime Data Area’라고 한다.

할당 받은 공간을 5영역으로 나누어 관리한다.

  • Class Area(=Method Area)
  • Stack Area
  • Heap Area
  • Native Method Stack Area
  • PC Register

Class Area(=Method Area) 란?

  • 클래스 파일의 바이트 코드가 로드되는 곳
    * 클래스 로딩이 이뤄지는 이유는 어떤 메소드가 호출되려면 먼저 그 메소드를 갖고 있는 클래스 파일이 메모리에 로딩되어야 한다. 그래서 클래스를 실행할 때 .class 파일을 찾아서 메모리가 로딩하는 것이다.

스택 영역(Stack Area)

  • 지역변수와 매개변수가 저장되는 곳
  • 프로그램의 실행 과정에서 ‘임시로 할당’되고, 그게 끝나면 바로 소멸되는 것들이 저장된다. 즉, 메소드가 호출될 때마다 그 메소드의 로컬 변수를 준비하고 메소드 호출이 끝나면 그 메소드를 위해 준비했던 모든 변수가 스택에서 제거된다.
  • 기본(literal)타입 변수는 스택 영역에 직접 값을 가진다.
  • 참조타입 변수는 힙영역이나 메소드 영역의 객제 주소를 가진다.
public class StackMemoryTest {
   public static void test1(int a){
      test2(++a)
      System.out.printf(test1() : %d\n”, a);
   }

  public static void test2(int a) {
     ++a
    System.out.printf(test2() : %d\n”, a);
  }
 
 public static void main (String[] args ) {
   int a = 1;
   test1(a)
   System.out.printf(main() : %d\n”, a);
}
 
} 

결과

test2() :  3
test1() :  2
main() : 1 

힙 영역 (Heap Area)

  • New 연산자로 생성된 객체 또는 생성되어 있는 객체가 저장되어 있고, Java constant pool 존재
  • 스택 영역에 저장된 로컬 변수, 매개 변수와 달리 힙 영역에 보관되는 메모리는 메소드 호출이 끝나도 사라지지 않고 가비지 컬렉터에 의해 지워질 때까지 또는 JVM이 종료될 때까지 유지된다.
  • 인스턴스를 별도의 힙 영역에 할당하는 이유는 인트턴스의 소멸 방법과 소멸시점이 지역변수(스택영역에 할당되는 변수)와 다르기 때문이다.
  • 8가지 literal 변수를 제외한 그외의 타입으로 정의된 변수들은 모조리 참조변수이다. 이런 참조 변수들은 실행될 때마다 많은 데이터들을 스택 메모리 영역에 뒀다 뺐다 하는게 매우 비효율적이므로, 힙 영역에 그 내용(진짜 값)이 저장되고, 스택 메모리에는 간단하게 그 주소만 저장이 되는 것이다.

[참고] literal type
https://velog.io/@locodingve/Java-DataType

참고 사이트 :

profile
같이 일 하고 싶은 개발자가 목표!

0개의 댓글