Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

까마귀코딩.log

백기선 자바스터디 01주차 본문

백기선 자바스터디

백기선 자바스터디 01주차

까마귀코딩 2023. 1. 26. 14:56
더보기
왜?  라는 생각을 달고 살자!

<< 총 15주차 까지 진행되며 주어지는 키워드를 가지고 블로그에 정리하며 공부하는 스터디 입니다 ! >>


 

 목표

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


01주차에서 학습할 것 ?

 

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

1. JVM  이란 무엇인가?


 

Java Virtual Machine의 줄임말.

 

자바를 실행하기 위한 가상컴이라고 생각하면 된다.

java는 os에 종속받지 않고 

실행되기 위해서 , java를 실행시킬 무언가가 필요하다.

그게 바로 자바버츄얼머신이다.

 

 

즉 == OS에 종속받지 않고, CPU가 JAVA를 인식, 실행할수 있게 하는 가상컴퓨터를 말한다.

 

 

 

 

- 자바 소스코드 ( .java )는 cpu가 인식을 하지 못하므로 -> 기계어로 컴파일을 해줘야 한다!!

 

- java는 JVM이라는 가상머신을 거쳐서 OS에 도달하기 때문에

OS가 인식할수있는 기계어로 컴파일 되는게 아니라 ! 

JVM이 인식할수 있는

자바 바이트코드 ( .class )로 변환된다.  -> java compiler 에 의해서 변환하는것!

 

 

java compiler 는 뭘까?

더보기

JAVA Compiler ?

JDK설치하면 bin에 존재하는 javac.exe 파일을 말한다 !

즉 jdk를 설치하면 포함되어있다는 말 !

 

javac명령어를 통해 .java파일을 .class 파일로 컴파일 해준다 ㅎㅎ

 

 


2. 컴파일 하는 방법 ?


 

한번 .java파일을 .class 라는 자바 바이트 코드파일로 만드는 과정을 살펴보자 !

 

javac이라는 명령어를 사용하면 컴파일 할수 있다고 했다 ~

public class CompileTest {
    public static void main(String[] args) {
        System.out.println("컴파일테스트");
    }
}

1. 이렇게 CompileTest라는 클래스명의 .java 소스파일을 생성했다.

 

더보기
/gst/git>Test  javac CompileTest.java

2. cmd 창을 열고 해당 .java 파일이 있는곳까지 가서 javac 명령어로 컴파일을 진행했다.

 

바탕화면

 

3. 현재위치인 바탕화면에 .class 파일이 생성된걸 확인할수 있다.

 

 


3. 실행하는 방법 ?


java 명령어로 클래스파일 실행시키기  !

 

 

 

1. 클래스 파일위치한 파일경로로 이동 !

2. java .class파일 이름 을 입력해 실행시키기 !

 

그러면 실행된다 !

 

 

 


4. 바이트 코드란 무엇인가 ?


 

가상컴퓨터인 VM에서 돌아가는 실행프로그램을 위한? 이진표현법을 말한다 !

 

- 자바 바이트 코드 (JAVA byteCode) 는

JVM이 이해할수 있는 언어로 변환된 자바 소스코드를 의미한다.

 

- 자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있다. 

 

바이트 코드는 다시 실시간 번역기 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다.

 

더보기

바이너리 코드??

이진코드라고 하기도 한다.

0과 1 로 구성되어있어서 컴퓨터가 인식할수 있다.

 

 

즉 cpu가 이해하는 언어는 바이너리코드, 

가상머신이 이해하는 코드는 바이트코드 이다.

 

 


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


 

 

JIT 컴파일 또는 동적 번역이라고 한다.

JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.

 

 

 

 

왜 필요한걸까 왜??

- 인터프리터 방식의 단점을 보완하기위해 도입되었다

 

 

어떤 방식일까 ??

-> 일단 인터프리터 방식으로 실행하다가

적절한 시점에 바이트 코드 전체를 컴파일하여서 기계어로 변경하고,

이후에는  더이상 인터프리팅 하지 않고 

기계어로 직접실행하는 방식이다.

 

 

 

기계어 ( 컴파일된코드 ) 는 캐시 보관하기 때문에 

한번 컴파일 된 코드는 빠르게 수행하게 된다.

 

 

물론, 

JIT 컴파일러가 컴파일 하는 과정ㅇㅣ  ! 

바이트코드를 인터프리팅하는것보다  훨 ~~ 씬 오래걸린다 ㅠ......

 

 

 한번만 실행되는 코드라면 ?? 뭐가 더 나을까??

그냥 컴파일 하지 않고, 인터프리팅 하는것이 훨씬 유리하다  ^^

 

 

 

따라서 JIT 컴파일러를 사용하는 JVM들은

내부적으로 해당 메서드가 얼마나 자주 수행되는지를 체크하고 

일정정도를 넣을때에만 컴파일을 수행한다.

 

 

 

자바에서는 

자바 컴파일러가 자바프로그램코드를 바이트 코드로 변환한다음에

실제 바이트 코드를 실행하는 시점에서 

자바 가상 머신 ( JRE ) 이 바이트 코드를 JIT컴파일을 통해 기계어로 변환한다.

 

 

 

 

 


JVM 구성 요소 ?? 


 

JVM은 무엇으로 이루어져 있나~~~??

 

 

크게 아래와 같이 이루어져 있다.

 

1. 클래스로더

2. 실행엔진

3. 런타임 데이터 영역 

 

 


1.  클 래 스  로 더  ? 

 

JVM 내로 클래스파일 [ .class ]를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.

 

런 타임시에 동적으로 클래스를 로드하고,

jar 파일 내에 저장된 클래스들을 JVM 위에 탑재한다.

 

즉, 클래스를 처음으로 참조할 때 , 해당 클래스를 로드하고 링크하는 역할을 한다.

 


2.  실 행 엔 진 ? 

 

말 그대로 클래스를 실행시키는 역할을 한다.

 

클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키고,

이것을 실행엔진에 의해 실행시킨다.

 

자바 바이트코드 ( .class ) 는 기계어가 아니라 인간어개념이다.

그래서 실행 엔진은

이런 바이트 코드를 실제로 JVM 내부에서 기계가 실행할수 있는 형태로 변경시켜준다.

 

 

 

 

실행엔진의 3가지

- 인터프리터

- JIT 컴파일러

- 가비지콜렉터

 

 

 

 ↳ 인터프리터

 

한줄씩 수행하기때문에 느리다.

실행엔진은 자바 바이트 코드를 명령어 단위로 읽는다 ->  그리고 실행한다.

 

↳ JIT(Just-In-Time)

 

인터 프리터 방식으로 실행한다음 적정시점에 바이트코드 전체 컴파일해서 기계어로 변경하고,

이후에는 기계어로 직접 실행하는방식이다.

 

↳ 가비지 콜렉터

 

더이상 사용되지않는 인스턴스 ( 쓰레기 값 ) 를 찾아서 메모리에서 삭제한다.

 

 

 

 


JVM 메모리 구성요소


 

<< 런타임 메모리  구조도 >> 

 

 

 

1. METHOD AREA

2. HEAP AREA

3. STACK AREA

4. PC REGISTER
5. NATIVE METHOD STACK

 

 

 

1. METHOD AREA ( 메소드 영역 ) ??

 

- 스태틱 변수, fianal 클래스 변수 등이 생성되는 영역이다.

- 클래스멤버 변수이름, 데이터  type, 접근제어자 정보같은 필드정보와 메소드이름,

리턴타입, 파라미터, type정보 (인터페이스인지,클래스인지) , constatnt pool ( 상수풀 ) 등이 생성되는 영역이기도 하다

 

더보기

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다

 

2. HEAP AREA ( 힙 영역 )  ??

 

 

- new 로 생성된 객체와 함께 배열이 생성되는 영역이다.

-메소드 영역에 로드된 클래스만 생성이 가능하고

가비지 컬렉터가 참조되지 않는 메모리를 확인하고 제거하는 영역!!

더보기

 new 로 생성된건 힙에 담긴다 !

 

 

3. STACK AREA ( 스택영역 )  ??

 

- 지역변수( 로컬변수 ) , 파라미터, 리턴값 , 연산에 사용되는 임시 값 등이 생성되는 영역이다.

 

int a = 10; 이라는 변수선언을 했다.

정수값(int)이 할당될수 있는 메모리 공간(주소값)을 

== a라고 잡아두고

그 메모리 영역에 값이 10 들어간다는 뜻이다 !

 

 

 ↳  즉 , 스택에 메모리에 이름을 a라고 붙여준다음에  값이 10인 메모리 공간을 만든다. 

 

더보기

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.

 

4. PC REGISTER ( PC 레지스터 )  ??

  쓰레드가 생성될때마다 생성되는 영역이다.

즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

 

 ↳  이것을 이용해서 쓰레드를 돌아가면서 수행할수 있게 한다.

 * cpu의 레지스터랑은 다르다.

 

 

 


5. NATIVE METHOD STACK  ??

 ↳ 자바 말고 다른 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

보통 c/c++ 코드 수행 영역이다 넘어가자 ~~

 

 

 

 

 

 

 


JDK 와 JRE의 차이 ? ??


JDK ?? 

 ↳  Java Development Kit (자바 개발 키트)

 

Java 를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)이다.

JDK 는 JRE를 포함하고 있다.
JRE에 있는 모든 것 뿐만 아니라 컴파일러(javac)와 jdb, javadoc 과 같은 도구도 있다.

 

즉, JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.

 

 


JRE ?? 

 ↳  Java  Runtime Environment (자바 런타임 환경)

 

JVM + 자바 클래스 라이브러리(Java Class Library) 등으로 구성되어 있다.
컴파일 된 Java 프로그램을 실행하는데 필요한 패키지이다.

 

 

 

차이점 요약 하기 !!!
JDK와 JRE의 차이점은 
먼저 개발키트와 실행키트라는점이 큰 차이점 이다.

JDK 내부에 JRE가 포함 되어있고,

JDK는 생성하고 실행하고 컴파일도 할수 있는 반면
JRE는 실행만을 위한 패키지라는것 ! 

JRE는 JVM을 포함하고 있다 !