JAVA공부하기 71

JVM 메모리 모델

 

레지스터

- JVM 상태 유지

 

실행 풀

- 심볼 테이블, 숫자 리터럴, 상수필드 유지

 

public class Helloworld

{

public static int f(int arg)

{

int i = 10;

int f = 3;

return i*arg*f;

}

 

public static void main(String[] args)

{

int i = 3;

f(i);

}

}

 

 

 

 

JAVA공부하기 70

JVM 메모리 모델

 

* Point 클래스 로드

* Point 내의 멤버변수가 Heap 영역에 생성 (static 변수는 메소드 영역에서 생성)

* 디폴트 생성자가 호출

 

 

 

 

* move() 메소드 호출

* Move() 메소드 지역 변수 및 매개변수는 스택에서, 클래스 멤버변수는 힙에서 참조

 

 

 

 

JAVA공부하기 69

JVM 메모리 모델

 

* JVM은 PointTest 클래스를 메소드 영역에 로드하고 main을 실행시킨다.

 

 

 

 

 

* P1, P2 변수를 스택에 생성한다.

 

 

JAVA공부하기 66

 

JVM 메모리 모델

 

- MemoryModeltest 클래스를 로딩할 때 메모리 상태

: 자바 가상머신은 MemoryModelTest 클래스를 메모리에 로드

 

- 프로그램을 실행하기 위한 초기작업 수행

: 클래스 구성 요소가 메서드 영역에 적재

 

 

 

- 자바가상머신이 main메서드를 호출할 때 메모리 상태

: main 메서드가 호출되면 main 메서드를 위한 스택 프레임이 할당된다.

: main 메서드 내에서 사용되는 매개변수, 지역변수 등이 main 스택 프레임에 위치하게 된다.

 

 

 

자바공부하기 64

JVM 메모리 모델

 

메소드 영역(Method area)

- 공유 메모리 영역이라고도 한다.

 

- 클래스의 메소드에 대한 바이트코드, 클래스의 전역변수인 클래스 병수(static)위치

 

- JVM에서 실행되고 있는 모든 스레드에 의해 공유

 

- JVM은 복수개의 스레드가 메소드를 정상적으로 사용하기 위해 동기화(synchronization)기법 제공

 

- static 필드(클래스 변수)

: 각 클래스의 static 필드가 확보

: 사용을 위해 클래스 이름으로 호출 시 메모리에 적재

 

- 바이트 코드(메서드)

: 메서드의 실행 로직에 대한 바이트코드가 메모리로 적재되는 공간

: 실행 로직이 메모리에 적재되야 cpu가 fetch할 수 있음

: 자바의 모든 로직은 메서드에만 존재

* 클래스는 ㅣㄹ드와 메서드로만 구성되어있기 때문

: 메서드에 대한 바이트코드도 static 필드와 마찬가지로 클래스를 객체 생성할 시점에 메모리에 적재(예외: main())

 

- 장점

: 기동시간의 단축

: 끝까지 사용되지 않은 클래스(필드, 메서드)가 있을 경우 메모리를 절약

 

- 메서드 영역은 프로그램이 시행되기 시작되기 시작할 때부터 끝날 때까지 계속 존재하는 것이라고 보면 된다.

 

- 다른 메모리 영역과의 차이

: 스택(Stack)과 같이 필요에 의해 임시적으로 생성되고 사라지지도 않고 힙(Heap)안의 객체와 같이 실행 시 확보되지 않고 계속해서 정적으로 존재

: 또한 스택은 스레드 별로 존재한다.

 

 

 

자바공부하기 63

 

JVM 메모리 모델

 

- 어플리케이션 프로그램을 만들 때 메모리나 어드레스 같은 낮은 수준의 사항을 너무 의식하면 안된다.

 

- 그것을 의식하지 않은 언어일수록 고급언어이며, JAVA도 그러한 고급언어에 속한다.

 

- 그러나 JAVA를 확실하게 이해하려면 메모리의 사용법을 어느정도 이해하는 것이 좋다 생각한다.

 

 

+ Recent posts