본문 바로가기

Programming/Java

JVM의 메모리모델

JVM의 메모리 모델(메소드영역, 스택, 힙)

 

- 메소드 영역(Method area)

공유 메모리 영역이라고도 한다.
클래스의 메소드에 대한 바이트코드, 클래스의 전역변수인 클래스 변수(static) 위치
JVM에서 실행되고 있는 모든 스레드에 의해 공유
JVM은 복수개의 스레드가 메소드를 정상적으로 사용하기 위해 동기화(synchronization)기법 제공
static 필드(클래스변수)
각 클래스의 static 필드가 확보
사용을 위해 클래스 이름으로 호출 시 메모리에 적재
바이트 코드(메서드)
메서드의 실행 로직에 대한 바이트 코드가 메모리로 적재 되는 공간.
실행 로직이 메모리에 적재 되야 cpu가 fetch할 수 있음
자바의 모든 로직은 메서드에만 존재
클래스는 필드와 메서드로만 구성되어있기 때문에
메서드에 대한 바이트코드도 static 필드와 마찬가지로 클래스를 객체 생성할 시점에 메모리에 적재(예외 : main())
장점
기동시간의 단축
끝까지 사용되지 않는 클래스(필드, 메서드)가 있을 경우 메모리를 절약
메서드 영역은 프로그램이 시행되기 시작되기 시작할 때부터 끝날 때까지 계속 존재하는 것이라고 보면 된다.
다른 메모리 영역과의 차이
스택(Stack)과 같이 필요에 의해 임시적으로 생성되고 사라지지도 않고 힙(Heap)안의 객체와 같이 실행 시 확보되지 않고 계속해서 정적으로 존재.
또한 스택은 스레드 별로 존재한다.

 

- 스택 영역(Stack area)

스택(Stack)이란 일반적으로 “무엇인가 쌓아 올려 가는 데이터 구조”를 가리킨다.
LIFO(Last-In-First-Out)특성
메소드가 호출되어 수행 될 때, 매개변수, 지역변수, 임시변수, 리턴 값 등을 저장하기 위한 공간
메소드 호출과 함께 메모리 공간할당, 메소드 수행을 마칠 때 시스템에 반환
잠시 쌓아 두는 곳
JVM은 스택 영역을 실행중인 스레드에 따라 개별적으로 구성한다.

 

- 힙(Heap)

자바에서 객체를 저장 할 때 사용하는 메모리 공간. 
new 를 이용하여 생성된 객체 저장
객체, 배열, String
new  이용하여 힙 안에 그만한 크기의 영역을 확보
A a = new A();
int a = new int[]{1,2,3};
String str = new String(“haha”);










아래의 소스를 이해하고 JVM의 메모리 모델을 그려보세요
(메소그 영역, 스택, 힙)

class Point {
int x, y;
void move(int x, int y) {
this.x = x;
this.y = y;
}
int getX() { return(x); }
int getY() { return(y); }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
void draw() {
System.out.println( "Point(" + x + "," + y + ")");
}
}

class PointTest {
public static void main(String[] args) {
Point p1, p2 = null;
p1 = new Point();
p1.move(4, 4);
p2 = new Point();
p2.move(2, -4);
}
}

c:>java PointTest

1. JVM은 PointTest 클래스를 메소드 영역에 main의 바이트코드 로드하고 main을 실행

2. main실행시 들어오는 인자 args를 main의 스택에 저장하고 null로 초기화 한다.

3. p1. p2를 스택에 저장하고 p1은 빈값, p2는 null로 초기화 한다.

4. p1 = new Point() 에 의해 Point 객체를 힙에 생성하고 어드레스를 p1 에서 보관
   (스택변수 p1이 메모리 힙의 Point 객체를 참조한다)

5. 메모리힙에 있는 p1이 참조하고 있는 Point객체의 x, y를 4, 4 로 셋팅
    move 메소드가 실행되는 동안 move의 스택영역에 로컬변수 x, y,를 할당하고 4을 대입 후
    인스턴스 변수 x, y에 대입 (this.x = x, this.y=y)
    move 메소드가 끝나면 로컬변수 x, y를 스택에서 해제

6. 이하 동일

'Programming > Java' 카테고리의 다른 글

우리말샘 API 2020. 06 .24  (0) 2020.06.29
국립국어원 API 2020. 06 .24  (0) 2020.06.29
신문기사 자연어 처리 2020. 06 .24  (0) 2020.06.29
JAVA 환경설정  (0) 2020.03.13
Stack과 Heap  (0) 2020.03.13