자바공부하기129.

패키지와 컴파일러/JVM

- 패키지 이름이 생략된 클래스/인터페이스 이름은 컴파일러가 import 문장을 참조하여 모두 완전한 패키지이름으로 변환하여 컴파일

: 이름으로 변환하는 과정 중 완전한 패키지 이름을 가진 클래스가 실제 로딩 가능한 클래스인지 알아보는 과정이 필요 - 클래스로더(import가 여러 개 될 수 있음을 기억할 것)

: 이것은 뒤의 classpath와 관련된다.

: 패키지 이름은 반드시 그 파일이 속해있는 디렉토리 이름과 일치해야 한다.

 

 

1. 컴파일러는 위와 같이 완전 클래스명 후보군을 만들어낸다.

2. 그 다음 CLASSPATH를 기반으로 위 후보 클래스 파일이 실제 존재하는지 검색한다. 자바 디폴트 라이브러리(rt.jar)를 검색한 후 현재 디렉토리(.)를 검사한다.

: java.lang.newClass를 찾아본다면 ./java/lang/디렉토리에 newClass.class파일이 있는지 찾는 것이다.

3. 찾아서 단 하나만 일치하는 게 var의 형을 결정한다. 그러나 여러 개가 있다면 충돌 에러를 발생시킨다.

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공부하기 67

JVM 메모리 모델

 

- main 메서드에서 sum 메서드를 호출할 때의 메모리 상태

: main 메서드에서 a,b매개변수를 이용하여 sum 메서드를 호출합니다.

 

- main 메서드에서 사용하는 a,b변수와 sum 메서드에서 사용하는 a,b매개변수의 이름은 같지만, 스택프레임 때문에 구분하여 상용

 

 

 

- sum 메서드에서 main 메서드로 리턴할 때의 메모리 상태

: sum 메서드의 수행이 끝나고 sum 메서드를 호출한 main 메서드로 되돌아 올 때, sum 메서드를 위해 할당했던 스택 프레임을 해제합니다.

: 이렇게 함으로써 main 메서드에서 정의한 a, b, c등과 같은 변수를 사용할 수 있도록 합니다.

 

 

 

 

JAVA공부하기 66

 

JVM 메모리 모델

 

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

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

 

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

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

 

 

 

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

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

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

 

 

 

JAVA공부하기 65

JVM메모리 모델

 

스택 영역(Stack area)

 

- 스택(Stack)이란 일반적으로 "무엇인가 쌓아 올려가는 데이터 구조"를 가리킨다.

: LIFO(Lastr-In-First-Out)특성

 

-  메소드가 호출되어 수행 될 때, 매개변수, 지역변수, 임시변수, 리턴 값 등을 저장하기 위한 공간

 

- 메소드 호출과 함께 메모리 공간할당, 메소드 수행을 마칠 때 시스템에 반환

: 잠시 쌓아두는 곳

 

- JVM은 스택 영역을 실행중인 스레드에 따라 개별적으로 구성한다.

 

 

 

 

자바공부하기 64

JVM 메모리 모델

 

메소드 영역(Method area)

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

 

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

 

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

 

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

 

- static 필드(클래스 변수)

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

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

 

- 바이트 코드(메서드)

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

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

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

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

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

 

- 장점

: 기동시간의 단축

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

 

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

 

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

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

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

 

 

 

+ Recent posts