JVM이 자바프로그램을 실행하는 과정

ㅇㅈㅁ
POCS
Published in
6 min readJul 15, 2019

--

JVM은 Java Byte Code를 기계어 코드로 번환해 실행시켜주는 역할을 합니다. 자바 프로그램은 윈도우, 리눅스, 맥 운영체제에 최적화된 JVM(Java Virtural Machine)에서 실행됩니다.

자바로 작성한 소스코드(.java)는 컴파일되면 바이트코드로 실행파일(.class)이 만들어집니다. 실행파일은 JVM을 거쳐 각 운영체제에서 실행됩니다. 운영체제나 실행환경 변경이 있어도 추가작업(코드 변경 등)없이 운용가능하기에 플랫폼에 독립적인 성질을 가집니다.

자바 프로그램이 실행될 때 JVM은 일정한 처리과정을 거칩니다.

이미지 출처: 『처음 해보는 자바 프로그래밍: JVM 메모리 구조로 이해하는 객체지향(2019)』,24p

1. 클래스 로더 (Class loader)

가장 먼저 클래스 로더가 동작합니다. 클래스 로더는 실행에 필요한 모든 실행 파일(*.class)를 찾아줍니다.

자바 클래스로더는 자바 클래스를 JVM으로 동적로딩하는 JRE의 일부입니다.

다음은 3가지 기본 클래스로더입니다. 클래스 로더는 아래와 같은 계층구조를 따릅니다.

Java8기준이며, Java 9부터는 … 3가지 기본클래스로더와 원칙은 유효하나 모듈시스템도입에 따라 구현내용이 바뀌었다고 합니다.

Bootstrap ClassLoader

3가지 기본 클래스로더 중 최상위 클래스로서, <JAVA_HOME>/jre/lib에 담긴 자바 라이브러리를 로딩합니다. 나머지와 다르게 Native C로 구현되어 있습니다.

Extension ClassLoader

<JAVA_HOME>/jre/lib/ext 폴더에 담긴 자바의 확장 클래스파일을 로딩합니다. Java로 구현되어있습니다. sun.misc.Launcher$ExtClassLoader 클래스에 의해 구현되어 있습니다.

Application ClassLoader

-classpath(또는 -cp)폴더에 있는 클래스를 로딩합니다. Java로 구현되어 있습니다. 개발자가 직접 작성한 클래스를 로딩합니다. sun.misc.Launcher$AppClassLoader 클래스에 의해 구현되어 있습니다.

아래 3가지 원칙에 따라 동작합니다.

  • Delegation Principle

클래스로더는 상위 클래스로더로 로딩요청을 위임합니다. 부트스트랩 로더에서부터 로딩요청을 수행하고 하위 클래스로더로 요청을 넘깁니다.

  • Visibility Principle

범위 규칙을 적용합니다. 하위클래스로더는 상위클래스로더의 클래스를 찾을 수 있지만 , 상위클래스로더는 하위클래스 로더가 로딩한 클래스를 사용할 수 없습니다.

  • Uniqueness Principle

하위 클래스로더는 상위 클래스로더가 로딩한 클래스를 다시 로딩하지 않습니다.

2. 바이트 코드 검증 (Byte code verifier)

클래스 로더가 모든 실행 파일을 준비하면 이 파일의 코드가 올바른지 검증합니다. 코드가 정해진 규칙에 따라 작성되었는지 등을 검증합니다.

자바 프로그램은 실행 시점에 코드의 유효성을 검증하는 과정을 거치므로 보안에 강하다는 장점이 있다고 합니다.

3. 기계어 코드로 변환

기계어코드만이 컴퓨터에서 실행됩니다. Java의 실행파일은 바이트코드이기 때문에 실행될 때 다시 한번 기계가 읽을 수 있는 형태로 인터프리터를 통해 해석됩니다.

JVM이 자바 실행파일을 기계어 코드로 변환하는 방식에는

  • 인터프리터
  • JIT (Just In Time) compiler

이 있습니다.

인터프리터는 명령문 단위로 기계어코드 변환을 수행해 처리속도가 느리다는 단점이 있습니다.

초기 자바에는 JVM이 인터프리터방식으로만 바이트코드를 해석했고 기계어코드로 컴파일된 프로그램처럼 빠르게 실행될 수 없었습니다. 이를 보완하기위해 JIT 컴파일러가 도입되었습니다.

JIT는 실행할 때 컴파일한다는 의미입니다. JIT compiler는 파일 전체를 한번에 기계어로 변환합니다. 미리 컴파일해놓고 실행하므로 처리 속도가 빠릅니다.

JVM종류

JVM기능을 구현한 여러 JVM이 있습니다. 대표적인 JVM으로 Hotspot, JRockit이 있는데 합쳐지고 있다고 합니다.

Java HotSpot VM은 두 가지로 나뉩니다.

  • Java HotSpot Client VM — 응용 프로그램 시작 시간과 메모리 사용 공간을 줄임으로써 클라이언트 환경에서 응용 프로그램을 실행할 때 최상의 성능을 발휘하도록 조정되었습니다.
  • Java HotSpot Server VM — 서버 환경에서 실행되는 응용 프로그램의 최대 프로그램 실행 속도를 위해 설계되었습니다.

HotSpot JVM에서 JIT컴파일

핫스팟 JVM은 JIT컴파일과 최적화를 수행합니다. 실행시 바로 컴파일하지않고 인터프리터가 먼저 동작하며 자주 사용되는 부분만 컴파일합니다. 컴파일 된 부분은 인터프리터보다 훨씬 빨리 실행됩니다. 자주 실행하는 부분에 적용되면, 프로그램 실행속도를 크게 단축할 수 있습니다.

※사용하고있는 JVM을 알려면?

System.out.print(System.getProperty(“java.vm.name”));java -version

출처, 참고문헌

https://docs.oracle.com/javase/specs/index.html

오정임, 『처음 해보는 자바 프로그래밍: JVM 메모리 구조로 이해하는 객체지향(2019)』, 23–25

http://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=220985785358&parentCategoryNo=&categoryNo=101&viewDate=&isShowPopularPosts=false&from=postList

https://en.wikipedia.org/wiki/Java_virtual_machine#Bytecode_verifier

http://math.hws.edu/javanotes/c1/s3.html

https://homoefficio.github.io/2018/10/13/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%EB%8D%94-%ED%9B%91%EC%96%B4%EB%B3%B4%EA%B8%B0/

https://www.google.com/search?q=Bootstrap+class+loader&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjErdfKrLTjAhXyxosBHX5ICpMQ_AUIECgB&biw=922&bih=593#imgrc=f1h-E9vvIMD7ZM

https://cornswrold.tistory.com/276

--

--