티스토리 뷰

Develop Story/JAVA

<JVM의 메모리 구조>

wisecow 2017. 6. 29. 13:30


* Java Virtual Machine (JVM)


/* 포스팅에 있는 거의 대부분의 내용은 자바의 정석 3rd Edition을 참조했습니다. */


#1 개요


 JVM은 자바번역기라고도 불리는데, 자바 바이트 코드와 컴퓨터의 운영 시스템 간에 번역기 역할을 하여 자바로 작성된 응용 프로그램을 윈도우나 매킨토시, 유닉스 등에서 사용할 수 있도록 해주는 소프트 웨어를 말한다. (출처: 지형 공간정보체계 용어사전)

 자바 버츄얼 머신은 내가 아직 잘 모를 뿐더러, 내용도 방대하기 때문에 자세하게 다루는 글은 다소 무리가 있다. 따라서 일단은, 용어 사전에 나오는 대로 받아들이는 것이 좀 더 적합하다고 생각한다.



#2 메모리 구조


 응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 주요 영역 (method area, call stack, heap)에 대하여 알아보자.




1. 메서드 영역(method area)

 

 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터 eg. static int cr; )를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 저장된다.


2. 힙(heap)


 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스변수(instance variable)들이 생성되는 공간이다.


3. 호출스택(call stack or execution stack)


 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비어진다.

 





#3 헷갈리는 용어 및 개념 다시 정리


1. 클래스 변수


 멤버 변수 중 static이 붙은 것은 클래스 변수라고 한다. 클래스 영역에 선언되어 있으며, 클래스가 메모리에 올라갈 때 (loading 될 때) 바로 생성되기 때문에 인스턴스가 없어도 별도의 사용이 가능하다. '클래스이름.클래스변수'와 같은 형식으로 사용한다. 예를 들어 Add 클래스의 클래스 변수 cv가 있다고 가정하면, 'Add.cv'와 같이 사용하면 된다.


 프로그램이 종료될 때 까지 유지되며, public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수(global variable)'의 성격을 갖는다.


2. 인스턴스 변수


 클래스 영역에 선언되며, 클래스의 인스턴스 (객체)를 생성할 때 만들어진다. 그렇기 때문에 인스턴스 변수를 사용하기 위해서는 먼저 인스턴스를 생성해야 한다. 이 부분이 클래스 변수와의 큰 차이점이다. 또한 클래스 변수와는 다르게 인스턴스별 고유의 독립적인 저장공간을 가지므로 여러 개의 인스턴스 별로 서로 다른 값을 가질 수 있다.






* 앞으로의 포스팅 방향


#1 JVM과 같은 핵심적이고 중요한 이슈 위주


 이번 포스팅처럼, 얼핏 보면 지루하고 시시한 이론처럼 보일 수도 있지만 자바를 꿰뚫는 근간적인 지식에 대해 포스팅할 예정이다. 물론 주인장 또한 아는 것이 많이 없고 배우는 입장이기 때문에, 게시글의 퀄리티가 크게 높지 않을 수 있지만 조금이라도 유용하고 자바의 이해에 도움이 된다고 판단하면 어김없이 업로드 할 예정이다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday