[JAVA] 자바 메모리 구조 - 1편


자바 메모리 구조

  • 컴퓨터 프로그램이 실행되기 위해 필요한 메모리를 우리는 ‘메인 메모리’라고 한다.
  • 물리적으로는 우리가 램(RAM)이라고 부르기도 한다
  • 메인메모리를 관리하는게 OS이고, JVM(자바 버추얼 머신!)은 OS로부터 필요한만큼 할당 받음.
  • JVM은 OS로부터 받은 메모리를  나누어 관리함
  • OS로부터 받은 메모리 공간을 “Runtime Data Area”라고 하며. 이 부분을 5개 영역으로 나누어 관리함
  • 크게는 3개 영역(메소드 영역, 스택 영역, 힙 영역)으로 분류한다.

    • Class Area(=Method Area, Static Area) : 클래스영역, 메소드 영역, 스태틱 영역
    • Stack Area : 스택 영역
    • Heap Area : 힙 영역
    • Native Method Stack Area : 네이티브 메소드 스택 영역
    • PC Register : PC 레지스터 영역


메소드 영역(Class Area, Method Area, Static Area)

  • 여기는 클래스 파일의 바이트 코드가 로드되는 곳.

    • JVM이 무엇인가를 실행하려면 먼저 그 바이트 코드들이 메모리 공간에 저장이 되어 있어야 한다. JVM은 메인 메소드를 호출하는 것으로 시작을 한다. 거기서부터 프로그램이 시작된다고 볼 수 있다. 우리가 메인메소드에서 사용하는 클래스와 static변수가 있을텐데, 바로 그것들이 이 메소드 영역에 올라온다.
  • 즉, 메소드 영역에 저장되는 바이트코드는 ‘프로그램의 흐름을 구성하는 바이트코드’이다. 이 바이트코드는 자바 컴파일러에의해서 컴파일된 친구들이기 때문에, 사실상 전체 바이트코드가 이 영역에 올라간다고 봐도 무방하다.

  • 클래스 로딩 : 메소드 영역에 바이트코드가 올라가는 것, 이는 클래스를 사용하는 시점에 해당 클래스의 바이트코드가 들어있는 파일을 찾아서 메모리에 로딩하는 것을 말한다.

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


클래스 로딩을 위한 JVM의 로딩 절차

  • 어떤 메소드를 호출하는 코드를 만났는데, 그 메소드를 가진 클래스 바이트코드가 아직 로딩된 적이없다면, 곧바로 JVM은 JRE라이브러리 폴더에서 클래스를 찾음.
  • 없으면, CLASSPATH 환경변수에 지정된 폴더에서 클래스를 찾음.
  • 찾았으면 그 클래스 파일이 올바른지 바이트코드를 검증한다.
  • 올바른 바이트코드라면 메소드영역으로 파일을 로딩한다.
  • 클래스 변수를 만들라는 명령어가 있으면 메소드 영역에 그 변수를 준비한다.
  • 클래스 블록이 있으면 순서대로 그 블록을 실행한다.
  • 이렇게 한번 클래스의 바이트코드가 로딩되면 JVM이 종료될때까지 유지된다.


Reference