티스토리 뷰

Programming/Java

자바 스터디 - 1주차

junojuno 2021. 10. 27. 17:15

<자바 스터디 1주차 - JVM은 무엇이고 자바 코드는 어떻게 실행하는가>

 

(1) JVM이란 무엇인가

JVM(Java Virtual Machine)이란 자바 바이트코드를 실행할 수 있는 주체로서 java program을 실행하기 위한 필수적인 rumtime 환경을 제공한다. Java source code를 compile해 bytecode로 전환 후 그것을 JVM에서 Interpret하여 실행한다.

"Write once, run anywhere" 특징이 있다. java class file이 하나의 execution platform으로 이동될 수 있다.

 예를들어 OS가 다른 macOS에서 개발된 Java program의 class file이 linux나 window에서 옮겨져 실행될수 있다는 말이다. (※ 주의 : Java가 OS에 독립적. JVM은 OS에 의존적이다)

.java 파일인 java source code가 javac compiler를 통해서 .class 파일인 bytecode로 변환되어 .class 파일이 JVM에 넘어가 기계어로 변환되어 실행되는 것이다.

그럼 먼저 바이트 코드란 무엇인가?

* 런타임 vs 컴파일타임

  컴파일타임(compile time) 이란

 : source code가 machine code로 컴파일 되는 과정

  런타임(runtime) 이란

 : 컴퓨터 과학에서 프로그램이 실행되고 있는 동안의 동작을 말한다. 컴파일된 프로그램을 유저가 열어서 실행할 때. 어플리케이션이

   실행중일때를 런타임이라고 한다.

  런타임 환경(runtime environment) 이란

 :  컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태.

출처 : O'REILLY Java in a Nutshell 

 

(2) Bytecode와 binary code

bytecode는 source code와 machine code의 중간적인것이라 보면된다. 특정 하드웨어가 아닌 가상컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.

bytecode의 전제 목표는 JVM interpreter에 의해서 효과적으로 실행되는 format이 되는것이다.

binary code는 0 과 1로 구성되어 있는 코드를 뜻한다. 그 중 가상머신이 이해할 수 있는 코드를 바이트코드라고 하며, 이를 컴퓨터(CPU)가 직접 해독하고 실행할 수 있는 가장 low-level 언어로 변환한 것이 machine code이다.

(binary code안에 bytecode가 포함되는 개념이다.)

여기서는 javac를 통해서 생성한 .class file이 바이트 코드이고, 이 클래스 파일을 JVM에서 java 명령어를 통해 실행한다.

 

(3) JVM의 구성요소

 

출처 : 위키피디아

그럼 이 bytecode를 다양한 cpu환경에서 OS에 의존하지 않고 이식성 문제 없이 실행하는 것을 도와주는 JVM의 구성요소는 어떻게 될까. 크게 Class Loader, memory, execution engine, native method로 나뉘어 진다.

1) Class Loader

JRE의 일부인 class loader 시스템은 컴파일 된 바이트 코드인 class 파일을 로드해 메모리에 저장하는 역할을 수행한다.

 

2) Execution engine 

Class Loader가 JVM내 런타임 데이터 영역에 클래스를 로딩하는 작업을 통해 실행 준비과정이 완료되면, JVM은 Interpreter를 통해 bytecode를 번역하여 실행한다.

실행 엔진 내부에는 interpreter, JIT 컴파일러, GC가 있다.

① Interpreter : .class 파일의 bytecode를 실행함.

② JIT compiler : 

가장 일반적인 JVM인 Hotspot JVM은 중요하고 자주쓰이는 hot method를 매우빠르게 JIT compiler를 통해 interpreter를 거치지 않고 machine code로 바꿔준다. 반복적이고 자주 사용되는 코드를 특정 저장소인 캐시에 저장하여 참조 필요시마다 불러온다.

자바 초장기에는 javac가 매우 최적화된 bytecode를 만드는 실수를 범했는데, 이는 JIT compilation의 도래로 중요한 method들이 매우 빠르게 machine code로 컴파일 되면서 JIT compiler의 일을 쉽게 만들어 주는것이 매우 중요하게 되었다. JIT compilation을 통해 얻는 이익이 최적화된 bytecode를 interpret하는것 보다 훨씬 컸다.

아래 interpreter와 compiler의 비교 설명에서도 나오지만, interpreter는 한줄씩 명령어를 해석해 처리하는 개념이기 때문에  번역 속도는 빠르나 실행속도는 느리다. 따라서 런타임시 클래스파일인 바이트코드를 네이티브 기계어로 한번에 컴파일 한 후 사용하여 실행속도를 증가시켜 이 JVM의 최적화를 통해 컴파일 된 C와 C++코드 보다 더 능가하는 퍼포먼스를 만든다.

③ GC(garbage collector) :

프로그램이 실행되면서 특정 데이터를 메모리에 저장하는데, 더 이상 참조되지 않는 데이터를 정리하는 역할을 수행하는것이 GC이다. 자바는 메모리 관리를 사용자가 아닌 JVM이 알아서 해준다. 

GC가 언제 호출되는지는 알 수 없으며, 사용자가 호출하더라도 메모리를 정리할 필요가 없다고 판단되면 실행하지 않는다.

 

3) Memory

① Stack  : 메소드 내에서 사용되는 값들이 저장되는 영역. 실행과정에서 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 임시 할당 영역. 메소드 호출 할 때마다 새 프레임이 생성되며, 메소드 호출 프로세스가 완료되면 삭제된다.

② Heap : new 명령어로 생성된 인스턴스와 객체가 저장되는 영역. GC의 관리대상이다. 

③ PC Registers : 현재 수행중인 JVM 명령의 주소값 저장하며 스레드가 시작될때 생성되며 스레드마다 하나씩 가지고 있다. 스레드가 어떤부분을 어떤 명령어로 실행할 지에 대한 기록을 한다.

④ Native Method Stacks : 기계가 읽기 쉽도록 만들어지는 native code를 실행시키는 영역으로 native library에 따라 native 코드 명령을 보관한다. 자바 대신 다른언어로 쓰여있다.

⑤ Method Area : 클래스, 변수, 메소드, static 변수, 상수 정보등이 저장되는 영역. 클래스 구조를 저장함.

 

4) Native Method Interface와 Native Method Libraries

① Native Method Interface : 프로그래밍 프레임워크이다. JVM에서 실행중인 Java 코드가 라이브러리 및 네이티브 애플리케이션으로 호출할 수 있도록 한다. 

② Native Method Libraries :  실행엔진에 필요한 Natice Libraires(C,C++)의 모음.

 

(4) Interpreter와 compiler 차이

Interpreter : 고급 언어로 작성된 프로그램을 한줄씩 번역해서 Machine Code로 번역하는 역할이다. 번역속도는 빠르지만 실행속도는 느리다. 

compiler : 전체 source code를 보고 명령어를 수집하고 재구성하여  Machine code로 변환한다. 일반적으로 Interpreter보다는 실행시간이 빠르다. 

이 말고도 보안에 있어서 Compiler는 Source Code를 재구성하기 때문에 코드 유출이 되지 않지만 Interpreter는 코드가 유출 될 수 있다.

 

(5) 컴파일 하는 방법

컴파일 한다는 것은 .java파일을 .class(바이트코드)를 만드는 것을 의미한다. JDK 자바 개발 도구를 설치하면 bin폴더 안에 javac라는 java compiler가 포함되어 있다.

javac fileName.java

javac명령어를 통해서 실행하지만 Intellij와 같은 IDE를 사용하는것이 보편적이다.

javac의 옵션은 다음과 같다.

옵션 설명 예제
-classpath, -cp 클래스패스, 즉 실행할 클래스의 위치를 지정한다. javac -cp "/Users/home/file.java"
-d 어디에 클래스파일을 생성할지 지정한다. javac -d "/User/home/path"
-encoding 소스 파일에 사용된 인코딩을 지정한다. javac -encoding "utf-8" file.java
-g 모든 디버깅 정보를 출력 javac - g ~ 
-verbose 컴파일러가 진행하는 작업을 모두 출력 javac -verbose ~
-sourcepath 소스파일 위치 지정 javac -sourcepath "/User/home/path"
-source 소스파일 자바 버전 지정 javac -source 1.8 ~
-target 타겟파일 자바 버전 지정 javac -target 1.8 ~

주의 할 점은 javac와 JIT compiler는 다르다. 

(6) 실행하는 방법

: java 명령어를 사용한다.

java fileName.class

위 명령어를 실행하면 JVM의 Class loader가 fileName.class파일을 JVM의 Memory로 가져온다. 

내부적으로는 Class loader에서 class파일을 받아 바이트 코드 변조를 확인 후, exection engine에서 실행되는 구조이다.

interpreter와 JIT compiler를 사용하여 실행한다.

 

※ 높은 버전의 자바 컴파일러 javac로 컴파일 한 것을 낮은 버전의 자바로(java) 실행하면 실행되지 않는다. (Error message. Unsupported Class Version Error)하지만 반대로 낮은 버전의 자바 컴파일러로 컴파일 한것은 높은 버전의 자바로 실행할 수 있다.

(7) JDK와 JRE의 차이

출처 : https://www.javacodemonk.com/difference-between-jdk-jre-and-jvm-6380989d

JRE(Java Runtime Environment)는 JVM, 자바 클래스 라이브러리, 자바 명령 등 기타 인프라를 포함한 컴파일 된 자바 프로그램을 실행하는데 필요한 패키지이다.

JDK(Java Development Kit)안에 JRE가 포함되는 개념으로 JRE는 자바 어플리케이션을 수행하기 위한 최소한의 환경이며 JDK는 JRE + 개발에 필요한 SW를 모아 놓은 좀더 큰 범위의 SW라고 볼 수 있다. JRE 뿐만 아니라 컴파일러(javac) 같은 도구들이 추가적으로 있다.

따라서 자바어플리케이션 개발을 위해서는 JDK를 필수로 설치해야 한다.

※ Java 9부터는 JDK, JRE를 구분하는것이 필요없게 되었다. JRE를 더이상 만들지 않는다. JDK에는 JRE에 관련된 것이 다 들어가 있기 때문에, Java 9 부터는 JDK만 제공하고 있다.

 

참고 : 

(1) 참고 도서 :

 - Do it! 자바 프로그래밍 입문 (이지스 버블리싱)

 -  Java in a Nutshell (O'REILLY)

(2) 참고 사이트 :

https://sowhat4.tistory.com/61

 

자바 스터디 1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

Why? 해당 내용은 백기선 님의 자바 스터디 주제를 공부하여 공유하고자 함이 목적 github.com/whiteship/live-study/issues/1 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. · Issue #1 · w..

sowhat4.tistory.com

https://velog.io/@aki/HotSpot-JVM

 

HotSpot JVM

Hotspot은 말 그대로 Hot한 Spot을 찾아서 해당 부분에서는 JIT 컴파일러를 사용하는 방법이다. 내부적으로 프로파일링을 통해 핫스팟을 찾아내고, 해당 부분에 대한 네이티브 코드를 생성한다.

velog.io

https://siahn95.tistory.com/entry/Java-JVM%EC%9D%B4%EB%9E%80-3-JVM%EC%9D%98-%EB%91%90-%EA%B0%80%EC%A7%80-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C

 

[Java] JVM이란? - (3) 구성 요소

지난 1편, 2편에 이어 마지막 3편이다. JVM이 어떻게 구성되어 있는지에 대해 알아본다. 이번 글도 역시 여기와 여기를 참고하며 작성하였다. JVM의 구성요소 자바 애플리케이션을 실행하기 위해 JV

siahn95.tistory.com

 

https://velog.io/@jaeyunn_15/OS-Compiler-vs-Interpreter

 

[OS] Compiler vs Interpreter

1\. 인터프리터 방식원래 인터프리터의 의미는 고급 언어로 작성된 프로그램을 한줄씩 번역해서 OS에서 인식하는 기계어로 변역하는 역할이다.자바 인터프리터는 JAVAC 명령으로 자바 프로그램을

velog.io

https://gblee1987.tistory.com/173

 

[Java-Live-Study] 1주차 - 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해

목표 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기. 학습할 것 JVM이란 무엇인가 컴파일 하는 방법 실행하는 방법 바이트코드란 무엇인가 JIT 컴파일러란 무엇이며 어떻게 동작하는지 JV

gblee1987.tistory.com

https://www.javacodemonk.com/difference-between-jdk-jre-and-jvm-6380989d

 

Difference between JDK JRE and JVM

Java Development Kit, Java Runtime Environment and Java Virtual Machine are three different terms that are key to a Java Development.

www.javacodemonk.com

https://xxxelppa.tistory.com/194?category=858435 

 

1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가

# 자바 소스 파일 (.java)을 JVM 으로 실행하는 과정 이해하기. # 학습할 것 JVM 이란 무엇인가 컴파일 하는 방법 실행하는 방법 바이트코드란 무엇인가 JIT 컴파일러란 무엇이며 어떻게 동작하는지 JV

xxxelppa.tistory.com

https://pc.net/helpcenter/answers/compile_time_vs_runtime

 

What is the difference between runtime and compile time?

Answer: Runtime and compile time are programming terms that refer to different stages of software program development. In order to create a program, a developer first writes source code, which defines how the program will function. Small programs may only

pc.net

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday