1주차 과제

hong918kr·2020년 11월 20일
0

whiteshipjavastudy

목록 보기
1/2

학습목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

학습할 것

  1. JVM이란 무엇인가
  2. 컴파일 하는 방법
  3. 실행하는 방법
  4. 바이트코드란 무엇인가
  5. JIT 컴파일러란 무엇이며 어떻게 동작하는지
  6. JVM 구성 요소
  7. JDK와 JRE의 차이



JVM이란 무엇인가?


Java Virtual Machine의 줄임말이다. 기존에 전통적인 C언어로 개발을 했을때에, 각 운영체제마다 컴파일을 다르게 해줬어야했는데, JVM으로 인해서 시스템 의존도를 줄일 수 있게 되었다. 각 운영체제에 맞는 JVM을 개발전에 설치를 하게되고 개발자는 운영체제에 신경쓰지않고 개발을 하게 됨으로 개발자의 편리를 도모해주는 역할을 하게되었따. 하지만 코드가 JVM을 통해서 가게됨으로 성능면에서는 손실이 생길 수 있지만, 개발의 편리함은 갖게 되었다.



컴파일 하는 방법


컴파일이라는건 사용자가 작성한 코드 (예: 자바코드)를 컴퓨터가 이해할수있는 machine language로 변환하는 과정이다. 쉽게 이야기하면 *.java 를 .class라고 변환 하는 과정이다. 여기서 *.class를 bytecode라고 부른다.


아래는 컴파일을 해볼 코드이다.
public class Test{
	public static void main(String args[]) {
    	System.out.println("Hi");
    }
}

이 자바 코드는 저장할때 .java로 저장이된다. 그리고 이걸 지금 .class로 바꿀텐데 (컴파일) 컴파일하는 방법은 태초에 java를 설치하고 나면 (jdk설치) 그 경로에 들어가서 bin폴더를 찾는다. 그리고 해당 경로에 cli 로

$javac [Test.java (이것은 자바 코드이름)]

입력한다.
그러면 .class를 확인할수있다.



실행하는 방법


위의 결과에서 Test.class를 확인했으면, 이제

$java [Test (이것은 파일명)]

java 명령어로 파일을 실행한다.
실행후에는

Hi

라고 command 창에서 확인이 가능하다

바이트코드란 무엇인가


.java (java파일)이 사용자가 이해하기 쉬운 언어라고 하면 .class(bytecode)는 JVM이 쉽게 이해할수있는 언어라고 할 수 있다.



JIT 컴파일러란 무엇이며 어떻게 동작하는지


JIT는 Just in time의 줄임말이다. JVM의 구성요소중의 하나인 execution engine 에 들어있는 요소이다. 위에서 생성했던 .class 바이트 코드를 class loader가 받고 실행에 필요한 준비과정이 완료된다. 그 이후에 execution engine이 번역을 시작한다.

이 곳에서 인터프리터, JIT 컴파일러, GC의 요소가 적용된다. 인터프리터는 이미 컴파일된 바이트 코드를 실행해준다. 그런데 우리가 코드를 작성하다보면 중복된 코드나 반복적으로 호출하는 함수가 있을수있는데, 최초에 인터프리터가 실행했던것이 추후에 다시 실행이되면 그 최초에 값을 케시에 저장하고있다가 실행하는대신 참조하는 방식으로 성능을 올리게되는데 그게 JIT 컴파일러의 동작이라고 할 수 있겠다.



JVM 구성 요소


출처: https://lazymankook.tistory.com/79


위의 그림은 JVM 구성요소를 보여주는 그림을 인터넷에서 가져왔다.

Source Code: 위에서 사용자가 쓴 .java 코드
Compiler: javac.exe 실행파일로 되어있는 .java 를 .class로 변환해주는 코드
Byte Code: javac가 변환한 .class코드

Garbage Collector 코드가 실행될때 더 이상 참조 되지 않는 데이터를 정리하는 역할을 수행

Class Loader 컴파일된 바이트코드를 읽어서 연결한뒤에 메모리에 저장하는 역할을 수행하고 내부적으로는 로딩, 링크, 초기화의 단계가 존재

Execution Engine class loader에서 준비된 실행과정들이 실제 실행하는 곳 (Interpreter, JIT Compiler, Garbage Collector가 있다.), 런타임 데이터 영역에 할당 된 바이트코드는

Runtime Data Areas JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 받은 메모리 공간

출처: https://asfirstalways.tistory.com/158



Method 클래스 정보나 static 변수가 저장되어 있으며 Application Context들이 전반적으로 공유되는 영역이다.

Heap 런타임 상황에 동적으로 할당되는 영역이다.

Stack Thread가 시작되는 시점에 생성되고 해당 method정보들이 저장된다.

PC register PC 레지스터는 현재 실행중인 Java virtual system command의 주소를 저장한다. 자바에서는 각 Thread의 별도의 PC register가 있다. CPU가 Instruction 을 수행하는 동안 필요한 정보들이 저장되어있다.

Native Method 네이티브 메서드 스택은 네이티브 라이브러리에 따라 네이티브 코드 명령을 보관한다.자바 이외의 언어로 작성된 Native 코드를 위한 stack공간이다.




JDK와 JRE의 차이


JDK
Java Developement Kit의 줄임말로 자바 애플리케이션 개발 환경이다. 소스파일 컴파일러, 디버거등 개발 도구가 포함되어있다. JRE (실행환경)을 포함하는 개념이다.

JRE
Java Runtime Environment의 줄임말로 자바 애플리케이션 실행환경이다. 이미 컴파일된 모듈 (바이트코드, JAR파일)을 실행할 수 있다.


참고:

  • https://jeongjin984.github.io/posts/JVM/
  • https://github.com/league3236/startJava/blob/master/live_study/week1.md
  • https://sowhat4.tistory.com/61
  • https://github.com/yeo311/java-study-with-whiteship/tree/main/week1
  • https://gblee1987.tistory.com/173
profile
일하면서 공부하면서 끄적끄적하는 공간임

0개의 댓글