Java 코드 실행 과정 정리

Bruce Han·2022년 3월 13일
1

Java 튜토리얼

목록 보기
1/3
post-thumbnail

Synopsis

자바 공부를 하다보면 실행할 때 .class 파일이 생성되면서 자바로 짠 소스가 실행되는 것이 보인다. 자바 수업을 들었을 때 교수님께서 협업할 때는 class 파일을 넘겨라라는 말씀까지 하셨던 게 어렴풋이 기억난다.
그냥 .java를 넘기면 되지 않나? 라는 생각이 들지만, 실행할 때 .class 라는 파일이 어떻게 해서 생겼나 궁금하기도 하고 그 이후의 과정도 알고 있으면 Java라는 언어에 대해 더 다가갈 수 있을 것 같아 정리하게 되었다.

자바 코드 실행 순서

1. 자바 소스 코드 작성

자바 소스 코드를 작성합니다.

2. 소스 파일 컴파일

자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다.
컴파일이 완료되면 Java Byte Code, 즉 .class 라는 확장자를 가진 파일 하나가 생성됩니다.
이 파일은 아직 컴퓨터가 읽을 수는 없고, 자바 가상 머신(JVM)이 이해할 수 있는 코드로 이루어져 있습니다.

3. 컴파일된 바이트 코드 전달

컴파일된 Byte Code를 JVM의 Class Loader에게 전달합니다.

4. 동적으로 로딩하는 클래스 로더

클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링킹합니다.
그런 다음에 Runtime Data Area 형태로 메모리에 적재합니다.

4.1. 클래스 로딩을 위한 JVM의 로딩 절차

1) 어떤 메서드를 호출하는 문장을 만났는데 그 메서드를 가진 클래스 바이트 코드가 아직 로딩된 적이 없다면, JVM은 바로 JRE 라이브러리 폴더에서 찾습니다.

2-1) 만약 찾다가 없으면, CLASSPATH 환경변수에 지정된 폴더에서 클래스를 찾습니다.

2-2) 찾았으면 그 클래스 파일이 올바른지 바이트 코드를 검증합니다.

3) 올바른 바이트 코드라면 메서드 영역으로 파일을 로딩합니다.

4) 클래스 변수를 만들라는 명령어가 있으면 메서드 영역에 그 변수를 준비합니다.

5) 클래스 블록이 있으면 순서대로 그 블록을 실행합니다.

6) 이렇게 한 번 클래스의 바이트 코드가 로딩되면 JVM이 종료될 때까지 유지됩니다.

5. Interpreter vs JIT Compiler

실행 엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행합니다.
이때 바이트 코드의 각 명령어는 1바이트 크기의 OpCode(Operation Code)와 추가 피연산자로 이루어져 있습니다.
실행 엔진은 하나의 OpCode를 가져와서 피연산자와 작업을 수행한 다음에 OpCode를 수행하는 식으로 동작합니다.

이 수행과정에서 실행 엔진은 바이트 코드를 기계가 실행할 수 있는 형태로 변경하는데,

  • 인터프리터(Interpreter) : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 해석은 빠르지만 전체적인 실행 속도는 느리다는 단점을 가집니다. JVM 안에서 바이트 코드는 기본적으로 인터프리터 방식으로 동작합니다.
  • JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로, 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후에는 해당 메서드를 더 이상 인터프리팅하지 않고 네티이브 코드로 직접 실행하는 방식입니다. 덕분에 속도는 인터프리터보다 빠릅니다.

네이티브 코드는 캐시에 보관되기 때문에, 한 번 컴파일된 코드는 캐시에서 바로 꺼내어 실행되어 빠르게 처리됩니다. 하지만 JIT Compiler가 컴파일하는 과정은 바이트 코드를 하나씩 인터프리팅하는 것보다 훨씬 오래 걸립니다.
그래서 JIT Compiler를 사용하는 JVM은 내부적으로 해당 메서드가 얼마나 자주 호출 및 실행되는지 체크하고, 일정 기준 넘었을 때에만 JIT Compiler를 통해 컴파일하여 네이티브 코드를 생성합니다. 즉, 한 번만 실행하면 되는 코드는 인터프리팅을 하는 것이 유리합니다.


References

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글