jvm 실행 동작 과정

2022. 11. 8. 17:14자바멘토링/자바의 신 1~7강 질문리스트 정리

1.자바언어를 컴파일 하면(컴퓨터 언어로 번역) 바이트 코드가 되는데

그상태에서 다시 자바 언어로 되돌릴수 있는가?

-자바 컴파일 과정의 거꾸로인 디컴파일에 대해서 설명

-바이트코드 상태에서 우리가 봤을때 해석이 가능한가?

-빌드가 된 결과물을 우리가 들여다 봐야 한다

-빌드했을때 의도하지 않은 결과를 보고 분석할수 있어야 한다.

 

 

자바?

자바는 os에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 jvm덕분이다. 그렇다면

jvm의 어떠한 기능 때문에 os에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 

알아보자 

 

자바 컴파일 순서

1.개발자가 자바 소스 코드(.java)를 작성합니다.

 

메모장(코드 작성)

2.자바 컴파일러(Java Compiler) 

  • 자바소스 파일을 컴파일 한다.
  • 자바바이트 코드(.class) 파일이 생성
  • .class파일은 바이너리 파일로 되어 있기 때문에 에디터에서 열어도 제대로 볼 수 가 없다.
  • 컴파일을하는 프로그램을 컴파일러라고 부르며, 자바에서는 javac.exe라는 프로그램이  역할 실행

 

파일 경로로 이동
javac.exe 실행

 

3.디스크에 .class파일이 저장된다 

4.컴파일을 마친 .class파일은 JVM에서 읽어서 운영체제에서 실행된다.

  • 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 
  • 런타임 데이터 영역(Runtime Data area),즉 JVM의 메모리에 올립니다.

(JVM이 OS위에서 실행되면서 할당받은 메모리 영역 PC레지스터,JVM스택,네이티브메소드,스택은

쓰레드 마다 하나씩 생성되고 힙(Heap),메소드영역(Method Area)은 모든 스레드가 공유해서 사용하게 된다.)

 

자바 가상 머신(JVM)의 동작 방식

 

JVM 동작 방식

  1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로 부터 메모리를 할당합니다.
  2. 자바 컴파일러(javac)가 자바 소스 코드(.java)를 자바 바이트코드(.class)로 컴파일 합니다.
  3. Class Loader를 통해 JVM Runtime Data Area로 로딩합니다.
  4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석합니다.
  5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서  Execution Engine에 의해   GC의 작동과 스레드 동기화가 이루어집니다.

JVM의 구조

자바는 동적으로 클래스를 읽어온다(인터프리터 언어) ,프로그램이 실행 중인 런타임이여야 모든 코드가

자바 가상 머신과 연결이 됩니다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 클래스로더 이다.

자바에서 소스를 작성하면 .java파일이 생성  그코드를 컴파일러가 컴파일 하면.class 이것을  클래스로더는

.class 파일을 묶어서 jvm이 운영체제로 부터 할당받은 메모리 영역인 Runtime Data Area로적재 합니다.

 

실행 엔진(Execution Engine)

앞서 말씀드렸듯 클래스 로더에 의해 JVM으로 로드된 .class 파일(바이트코드)들은 Runtime Data Areas의 Method Area에 배치되는데, 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여, 정의된 내용대로 바이트 코드를 실행시킵니다. 이때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진(Execution Engine)입니다. 실행 엔진은 바이트코드를 명령어 단위로 읽어서 실행합니다.

 

 

디컴파일

 

디컴파일 ?

자바로 작성되어있는 .java 파일을 컴파일하게 되면 바이트코드인 .class 클래스 파일이 생성됩니다. 이렇게 생성된 class 파일을 열면 JVM에서만 해석할 수 있는 알 수 없는 코드들로 작성되어 있어 개발자 입장에서는 알아볼 수가 없는데요. 그렇기 때문에 class 파일의 내용을 확인하기 위해서는 class 파일을 다시 java 파일로 바꿔주는 디컴파일 과정이 필요합니다.

JD-GUI는 현재 가장 널리 사용되는 자바 디컴파일러로 가벼우면서도 강력한 기능을 가지고 있습니다. 배포파일의 class 파일 확인이나, 라이브러리 jar파일 안에 있는 파일들의 코드를 확인하고 싶을 때 유용하게 사용됩니다.

 

디컴파일 결과
컴파일된  바이트 코드??// 바이트 코드를 우리가 읽을 수 있다?