티스토리 뷰

프로그래밍/java

JVM 과 메모리 구조

박스여우 2016. 11. 23. 14:30


■ JVM - Java virtual machine

JVM은 자바를 실행하기 위한 가상 머신입니다. java가 어떤 플랫폼에도 상관 없이 독립적으로 구동될 수 있는 비밀이 바로 이 JVM에 있습니다. Java로 작성된 프로그램은 모두 이 JVM이라는 가상 컴퓨터 위에서 구동되기 때문에 Java 애플리케이션이 실행되기 위해서는 받드시 JVM이 필요합니다. JVM은 Java의 컴파일에 관련하여 연관이 깊은데 이에 대한 내용은 이전 포스팅에서 이미 다뤘습니다. (http://boxfoxs.tistory.com/244)



이번 포스팅에서는 이러한 JVM의 메모리 구조에 대해서 알아보고자 합니다.




JVM의 메모리 구조

응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 할당 받은 메모리를 용동에 따라 여러 영역으로 나누어서 관리합니다. 구 중 메소드 영역, 호출 스택, 힙 이 세가지의 주요 영역이 있습니다.



1.메서드 영역(Method area)

메서드 영역은 모든 스레드가 공유하는 영역으로 공유 메모리 영역 이라고도 합니다.

메서드 영역을 사용하는 것들은 다음과 같습니다.


- 필드 정보 : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보

- 메소드 정보 : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보

- Type 정보 : Type의 속성이 Class인지 Interface인지의 여부

- 상수 풀 : Type(클래스 또는 인터페이스)에서 사용된 상수를 저장

- 클래스 변수 : 클래스의 전역변수인 클래스(Static) 변수


JVM이 읽어 들인 클래스와 인터페이스에 대한 런타임 상수 풀, 각각의 클래스와 클래스의 메소드에 대한 바이트코드와 클래스의 전역변수인 스태틱 변수가 이 메소드 영역에 생성됩니다. 



2.힙(Heap)

힙은 자바에서 객체를 저장할 때 사용하는 공간이라고 할 수 있습니다.

new 연산자로 생성된 객체와 배열이 저장됩니다. 즉 프로그램이 실행되는 중에 생성되는 인스턴스는 모두 힙에서 생성됩니다. 또한 인스턴스 변수들이 생성되는 공간이기도 합니다.


힙 공간은 또다시 3가지의 공간으로 나누어져 사용됩니다.

1. Permanent Generation : 생성된 객체들의 주소 값이 저장된 공간

2. New Area

 - Eden : 객체들이 최초로 생성되는 공간

 - Survivor : Eden에서 참조되는 객체들이 저장되는 공간

3. Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간


쉽게 말해서 힙 영역에는 배열, 열거, 클래스의 인스턴트 등의 참조 타입이 주소형식으로 저장됩니다.



3.호출스택(Call Stack)

호출스택은 Call stack 또는 execution stack 이라고도 불립니다. 호출스택은 메소드의 작업에 필요한 메모리 공간을 제공합니다. 메서드가 호출되면 호출스택에 해당 메소드를 위한 메모리가 할당되며 메소드가 작업을 수행하는 동안의 지역변수들, 매개변수들과 연산의 중간결과등을 저정합니다. 그리고 메서드가 작업을 종료하면 할당된 메모리는 반환되어 비워집니다.


호출스택은 말 그대로 스택구조를 가지고 있습니다. 따라서 호출된 메소드들의 메모리들은 스택 자료구조를 통해 관리됩니다.


위의 그림을 보면 가장 첫 번째 호출된 메소드를 위한 메모리 공간이 가장 아래에 마련되고 그 이후에 호출된 메소드들의 공간은 위에 쌓이게 됩니다. 따라서 호출스택의 가장 위에 위치한 메소드가 현재 수행되고 있는 메소드입니다. 그림에서는 현재 수행중인 메소드를 짙은 파란색으로 표시하였습니다.


현재 수행중이던 메소드인 main 메소드가 method1을 호출했을때 main 메소드는 수행을 멈추고 method1메소드가 수행을 하게 됩니다. 따라서 아래쪽에 있는 메소드들은 위의 메소드의 수행이 종료될때 까지 기다리게 됩니다.



스택과 쓰레드

Java를 좀더 공부하셔서 쓰레드라는 개념을 아시는 분들은 여러 쓰레드에서 어떻게 Stack에 접근하는지 궁금증이 생기실것 같습니다. 하지만 Stack 은 다른 Heap이나 메소드 영역과 같이 JVM에 하나만 존재하는 공간이 아니라 쓰레드가 생성될때 마다 Stack영역이 동시에 생성됨으로써 하나의 쓰레드당 하나의 Stack영역을 가지게 됩니다.

(사실 이건 제 궁금증이였다는..)



마무리

JVM의 메모리 구조는 Java를 배울때 가장 기본적으로 짚고 넘어가야 하는 부분 입니다. 저 역시 고1인 작년에 배웠지만 그 이후로 메모리구조와 만나볼 일이 없어서 까먹었기 때문에 다시 이렇게 블로그에 정리를 합니다. 무엇보다도 기초가 중요하다는 사실! 잊지 마세요!


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함