728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=AWXPnMDZ9I0

 

1. 소스 코드 작성

Person이라는 객체를 만들었다. 이름은 "이정록" 그리고 나이는 26이다.

Person이라는 객체 타입의 p 변수를 만들었다.

이 p 변수는 Person 객체의 모든 method들을 사용할 수 있다.

이클립스에서 run 버튼을 누르면 이 소스 코드들이 컴파일 되고 실행된다.

 

변수들은 어디에 저장이 되고

어떻게 구동이 되는 걸까요?

 

2. 소스코드의 바이트 코브 변환

방금 본 자바 소스 코드는 .java의 형태로 저장이 된다.

그리고 이 자바 소스 파일을 자바 컴파일러가 바이트 코드로 바꿔주는데 이것은 .class파일로 저장이 됩니다.

작성한 코드를 숨기는 1차원의 의미도 있지만

바이트 코드로 바꿨으니까 문법 검사와 같은 작업을 이후에는 하지 않게 되면서 시간을 단축시키는 의미도 있다고 합니다.

그러나 이 방식은 소스 코드 변경시마다 컴파일을 하고 실행시켜야 되기 때문에 시간이 조금 오래 걸린다.

3. 클래스 파일 (바이트 코드)

이렇게 변경된 바이트 코드 즉, 클래스 파일들은 클래스 로더가 JVM 메모리 영역 즉 Runtime Data Area로 로딩시킵니다.

Runtime Data Area는 총 5개의 영역으로 구분되어 있습니다.

메서드와 힙영역은 모든 스레드가 공유하는 영역이고

스택, PC 레지스터, 네이티브 메서드 스택은 스레드 마다 하나씩 생성되는 공간입니다.

3.1 메서드 영역

메서드 영역은 JVM이 시작될 때 생성되는 공간으로 바이트코드가 이 영역에 저장됩니다.

모드 스레드가 공유하는 영역이니까, 클래스와 변수 정보 그리고 static으로 선언한 변수가 저장되는 공간이다.

3.2 힙 영역

Heap 영역에는 동적으로 생성된 객체가 저장되는 영역이다.

즉 힙 영역에는 new 연산을 통하여 동적으로 생성된 인스턴스 변수가 저장된다.

예를 들어, 클래스의 객체 그리고 배열등이 있다.

생성된 변수는 해당 객체가 소멸되기 전이나, GC가 정리하기 전까지는 이 영역에 남아있습니다.

쉽게 소멸되는 데이터가 아니다.

3.3 힙

힙 영역은 가비지 컬렉션의 대상이 되는 공간이다.

효율적인 가비지 컬렉션을 수행하기 위해서 더 세부적으로는 다섯 가지 영역으로 나뉘게 된다.

3.4 스택

지역 변수, 메서드의 매개 변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역

메서드의 호출이 종료되면 이 안에 선언된 변수들은 사라진다.

그러니까 주로 금방 사용되고 금방 사용이 끝나는 데이터가 저장되는 영역이다.

3.5 헷갈릴 만한 이슈

- 변수의 저장 방법

객체를 생성했다.

이렇게 생성한 객체를 참조하는 변수 p는 Stack에 저장이 된다.

그리고 동적으로 생성한 Person 객체는 Heap 영역에 저장이 된다.

- 변수의 타입 이해

Primitive Type은 boolean, byte, short, int, long, char, float, double이다.

이를 제외한 나머지가 바로 Reference Type이다.

이러한 변수들이 실행될 때 마다 스택에 쌓여서 넣었다 뺐다하면 비효율적이므로 스택이 아닌

Heap영역에 그 진짜 메모리를 저장하고

그 메모리를 참조하는 주소를 stack영역에 저장하는 것이다.

3.6 PC Register

PC 레지스터는 프로그램 카운터라고 

우리가 일반적으로 알고 있는 컴퓨터를 의미하는 것이 아니다.

그리고 운영체제를 공부한 분이 아는 우리가 일반적으로 아는 CPU 레지스터 내부에 있는

다음에 실행될 명령어의 주소를 저장하는 공간을 의미하는 것이 아니라

스레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간이다.

스레드가 시작될 때 생성되며 현재 수행중인 JVM의 명령어 주소를 저장하는 공간이다.

3.7 Native Method Stack

자바 프로그램이 컴파일되어 생성되는 바이트코드가 아닌

 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.

 

Runtime Data Area에 로딩된 클래스 파일이 Execution Engine을 통해 해석될 차례이다.

Execution Engine은 로드된 클래스 파일의 바이트 코드를 실행하는 엔진이다.

 

그리고 바이트 코드를 실행시키기 위해서는 

바이트코드를 컴퓨터가 이해할 수 있는 기계어로 바꾸는 작업이 필요하다.

여기서 두 가지의 방법이 있다.

Interpreter는 명령어를 한 줄 한 줄 해석하면서 실행한다.

그리고 JIT Compilter (Just In Time Compiler) 는 Interpreter의 단점을 해결하기 위한 방법으로 

Runtime 시간에 한꺼번에 변경하여 실행한다.

이제 이렇게 기계어로 해석된 것들이 이제 

Runtime Data Area에 배치되어 스레드 동기화나 가비지 컬렉션을 수행하게 된다.

마지막으로 Native Method Interface(JNI)와 

Native Method Library를 살펴보겠다.

Native Method Interface(JNI)는 

JVM에 의해 실행되는 코드 중 네이티브로 실행되는 것이 있다면

해당 네이티브 코드를 호출하거나 호출될 수 있도록 만든 일종의 프레임워크이다.

그리고 Native Method Libraries는 네이티브 메소드의 실행에 필요한 라이브러리이다.

 

감사합니다.

728x90
반응형
LIST

+ Recent posts