다시 힘을내어 포스팅을 해보려고 한다. 아자아자! 비록 구글 너가 애드센스 승인을 빨리 안해주지만 나는 힘을내어 포스팅할거야.


오늘 다루려고 하는 것은 자바의 메모리 구조이다.


메모리 구조가 어떻게 되어 있고, (메모리 구조가 여러 영역으로 나누어져 있는데 그 영역이) 어떻게 다른지를 아주 짧고 간단하게 스쳐지나가듯 짚도록 하겠다.




자바의 메모리 구조

이전 포스트였던가. 자바 가비지 컬렉터를 이야기하면서 JVM이 실행되면 OS가 JVM에게 필요한 메모리를 할당해준다고 했다.


컴퓨터 프로그램이 실행되기 위해 필요한 메모리를 우리는 '메인 메모리'라고 한다. 우리말로는 주기억장치쯤 되시겠다.

물리적으로는 우리가 램(RAM)이라고 부르는 아이다. 

이 메인메모리를 관리하는게 OS이고, JVM(자바 버추얼 머신!)은 OS로부터 필요한만큼 할당받는거다.


이놈 JVM은 OS로부터 받은 메모리를  나누어 관리한다.


전문용어로 OS로부터 받은 메모리 공간(?)을 "Runtime Data Area"라고 하는데. 이 에뤼아를 5개 영역으로 쪼개서 관리한다.


왜 굳이 나눠서 관리 하느냐고?


우리가 보통 물건을 둘 때에도 용도에 맞게 나름의 위치가 있듯이... 샴푸는 욕실, 필기도구는 서재.. 얘네들도 똑같다고 이해하면 된다.


자 그럼 용도에 맞게, 어떻게 나누어 관리하느냐 하면.


- Class Area(=Method Area)

- Stack Area

- Heap Area

- Native Method Stack Area

- PC Register


이렇게 나눠서 관리한다. 


크게는 3개 영역(메소드 영역, 스택 영역, 힙 영역)으로 분류한다.


그림으로 한번 봐야, 기억에 오래 남는다. 서비스루다가.


Class Area

 = Method Area 

 = Static ARea 

Stack Area 

Heap Area 

Native Method Stack Area 

PC Register 


1. 메소드 영역(Class Area, Method Area)

이 영역은 중요해서 그런가.. 이름이 여러 개다. 

그 중 나는 처음 배울 때 '메소드 영역'이라는 이름으로 배워가지고.. 주로 이 이름을 사용하도록 하겠다.


메소드 영역, 여기는 클래스 파일의 바이트 코드가 로드되는 곳이다.

엥? 이게 무슨말이냐고?


JVM이 뭔가를 실행하려면 먼저 그 바이트 코드들이 메모리 공간에 저장이 되어 있어야 한다.

JVM은 메인 메소드를 호출하는 것으로 시작을 한다. 거기서부터 프로그램이 시작된다고 볼 수 있다.

우리가 메인메소드에서 사용하는 클래스와 static변수가 있을텐데, 바로 그것들이 이 메소드 영역에 올라온다.


즉, 메소드 영역에 저장되는 바이트코드는 '프로그램의 흐름을 구성하는 바이트코드'이다.

이 바이트코드는 자바 컴파일러에의해서 컴파일된 친구들이기 때문에, 사실상 전체 바이트코드가 이 영역에 올라간다고 봐도 무방하다.




여기서 잠깐. 


이렇게 메소드 에뤼아에 바이트코드가 올라가는것을 "클래스 로딩" 이라고 한다.

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


클래스 로딩이 이뤄지는 이유는 다시정리하자면!


=> 어떤 메소드가 호출되려면, 먼저 그 메소드를 갖고 있는 클래스 파일이 메모리에 로딩되어있어야 한다.

     그래서 클래스를 실행할 때 *.class 파일을 찾아서 메모리에 로딩하는 것이다.


클래스 로딩을 위한 JVM의 로딩 절차는 다음과 같다.

1. 어떤 메소드를 호출하는 문장을 만났는데, 그 메소드를 가진 클래스 바이트코드가 아직 로딩된 적이없다면, 곧바로 JVM은 JRE라이브러리 폴더에서 클래스를 찾음.

2. 없으면, CLASSPATH 환경변수에 지정된 폴더에서 클래스를 찾음.

3. 찾았으면 그 클래스 파일이 올바른지 바이트코드를 검증한다.

4. 올바른 바이트코드라면 메소드영역으로 파일을 로딩한다.

5. 클래스 변수를 만들라는 명령어가 있으면 메소드 영역에 그 변수를 준비한다.

6. 클래스 블록이 있으면 순서대로 그 블록을 실행한다.

7. 이렇게 한번 클래스의 바이트코드가 로딩되면 JVM이 종료될때까지 유지된다.






----

자 오늘은 여기까지.

  1. 악오 2017.06.01 00:11

    구수한 말투 잘 보고 갑니다

  2. 엄선생의수제자 2017.06.01 11:46

    굉장히 좋은 정보네요 ^^

  3. while(alive) {eat(); sleep(); code();} 2018.05.19 15:01

    이해하기 쉽게 설명이 되어 있네요~ 감사합니다~

  4. David 2020.01.07 16:10

    좋은자료 감사합니다~~ 블로그로 공유해갈게요!!

  5. David 2020.01.07 16:10

    좋은자료 감사합니다~~ 블로그로 공유해갈게요!!

  6. 일용직노동자 2020.12.26 22:25

    매우 좋은 글 감사합니다!! 출처남기고 부분인용을 해가도 될까요?

+ Recent posts