JAVA - 1. JVM 구조와 컴파일 방식

박원종·2022년 7월 5일
0

JAVA STUDY

목록 보기
1/3
post-thumbnail

JVM 이란 무엇인가?

JVM은 java 파일을 실행시키는 가상머신
-> 이로인해서 자바실행파일이 운영체제에 독립적일 수 있음
-> 어떠한 운영체제라도 JVM이 설치되어 있으면 java 파일은 실행 가능
But, JVM은 운영체제 종속적이다 -> 운영체제에 따른 jvm 다양한 버전 제공

컴파일 방법

  1. .java 파일을 바이트코드로 변경 -> .class 파일
    ex) java Hello.java -> Hello.class
  2. .class 파일을 JVM에 의해 운영체제가 해독할 수 있는 기계어로 번역
  3. 운영체제에 의해 실행

classpath 란?

클래스를 찾을 때 시작점이 되는 위치(경로)
보통은 실행명령을 받은 클래스가 위치한 곳에 존재해야함
-> 하지만, classpath를 설정해주면 그 위치대로 잘 찾아감 .;lib
. 현재 디렉토리
; 경로 구분자 / 의 역할

java -classpath “.;lib” [파일명] 

-> 클래스 패스 설정과 동시에 실행

귀찮으면 환경변수를 설정하자!
-> java [파일명]
으로 실행하면 자동으로 클래스패스가 설정된 대로 실행된다.

참고 링크
https://velog.io/@ovan/%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%EC%9E%90%EB%B0%94-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EC%8B%A4%ED%96%89

실행방법


사진 출처 https://velog.io/@livenow/Java-JVM%EC%9D%B4%EB%9E%80

바이트코드란 무엇인가

특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 시랳ㅇ 프로그램을 위한 이진 표현법이다
-> 가상머신을 위한 코드
-> JVM 에서 [파일명].java 파일을 컴파일 결과 생긴 [파일명].class 파일을 의미

바이너리 코드란?

컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드를 의미한다
-> 보통 바로 cpu나 os가 인식해 실행가능한 코드를 의미

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

바이트 코드(.class)파일이 JIT 컴파일러에 의해 바이너리 파일로 변경

JVM 초창기 인터프리터 방식이라 너무 느렸음 -> JIT 컴파일러로 보안
바이트 코드 -> 어셈블러같은 네이티브 코드로 바꿈 -> 변환하는데 비용 많이듬
따라서 인터프리터 방식과 JIT 방식을 섞어서 씀
jvm은 해당 메서드가 얼마나 자주 호출되는지 파악 ->
인터프리터로 하다가 일정 기준 초과 하면 JIT 컴파일러 방식으로 실행
해석 결과 -> 캐싱(저장) -> 또 필요할때 해석안하고 바로 가져온다

  • 네이티브 코드 : cpu와 os가 직접 바로 실행 가능한 기계어 같은 코드 (.exe, .dII 등이 포함)

JVM 구성요소

Class Loader/ Execution Engine/ Garbage Collector/ Runtime Data Area

  1. ClassLoader -> 런타임 시에 동적으로 필요한 클래스들을 JVM에 로드하는 역할
  2. Execution Engine -> Runtime Data Area에 있는 바이트코드를 읽고 실행
  3. Garbage Collector -> 힙 메모리 영역에 생성된 객체들 중 참조가 끊긴 것들 탐색 후 제거하는 역할 , GC의 시간은 개발자가 정하지 못함, JVM이 알아서 수행
  4. Runtime Data Area -> JVM 메모리 영역/ 어플리케이션 실행시 사용되는 데이터를 적재하는 공간/ 크게 5개로 또 나뉨

Runtime Data Area:

1) Method Area : 
모든 쓰레드가 공유하는 공간/ 
클래스, 인터페이스, 메소드, 필드, Static 변수 정보 등 바이트코드를 보관
jvm 깔때 내 컴퓨터의 2GB 메소드 영역을 쓸게요 —> 2GB, 클래스 복잡 웹 어플리케이션 
java8 부터는 Native Area (OS에서 관리하는 메모리 영역) 으로 포함됨.
java heap이 아님.

2) Heap Area: 
모든 쓰레드가 공유하는 공간/ 
new로 생성된거 다 여기 들어감/
GC대상

3) Stack Area: 
스레드 하나당 별개의 영역 할당
책에서는 call stack이라고 명함/
메소드 호출 시 그 메서드만을 위한 메모리 공간 생성/
메소드 안에서 사용되는 값 저장/
호출된 메서드의 매개변수, 지역변수, 리턴 값 등을 임시로 저장 /

JDK JRE의 차이

  • JRE ( Java Runtime Environment) : 최소한 실행은 가능하게 하자
    ex) JVM , 클래스 라이브러리(Java API)

  • JDK(Java Development Kit) : 개발에 도움이 되는 도구들이 들어있음
    ex) javac.exe + JRE

profile
잡코딩

0개의 댓글