여니의 프로그래밍 study/Java

[Java] 자바 프로그램 실행 과정 및 동작 원리 (feat. JVM)

여니's 2023. 5. 24. 15:30

 


1. 컴파일이란? (Compile)

: 컴파일은 사람이 이해할 수 있는 언어로 작성된 코드

컴퓨터가 읽을 수 있는 언어(기계어)로 변환하는 과정을 의미한다.

 

컴파일의 목적은 코드의 구문과 의미를 확인(ex. 오류코드 확인) 하고 최적화를 수행하며 

효율적이고 JVM에서 실행하기에 적합한 바이트코드를 생선한다.

 

컴파일은 Java 컴파일러(javac) 또는 통합 개발 환경(IDE)에서 수행한다.

 

 

 

 

 

 


2. .java 파일 vs .class 파일

(1) .java 파일

: Java 언어로 작성된 소스 코드 파일이다. 

즉 컴파일 되기 전의 소스 파일

 

(2) .class 파일

: Java 컴파일러에 의해 생성된 컴파일된 바이트코드 파일이다.

자바 가상 머신(JVM)에서 이해하고 실행하는 바이트코드 명령이 포함되어 있다.

 


3. JVM (Java Virtual Machine)

: 자바를 실행하기 위한 컴퓨터

 

일반 애플리케이션은 OS에 종속적이어서

OS에 맞게 변경해야한다.

 

 

하지만 Java 애플리케이션은 OS 사이에 JVM이 있기 때문에

JVM하고만 상호작용을 하게 된다.

따라서 다른 OS에서도 프로그램 변경 없이 사용이 가능하다.

즉 OS로부터 독립적이다.

출처 chatgpt

 

JVM의 사용 목적

1. 플랫폼 독립성

: JVM이 설치된 모든 플랫폼에서 실행될 수 있다. 

 

2. 메모리 관리

: 가비지 수집이라는 자동 메모리 관리 기술을 포함하여

메모리 할당 및 할당 해제를 관리한다.

 

3. 보안

: 안전한 실행 환경을 제공하는 내장 보안 메커니즘이 포함되어 있다.

무단 액세스를 방지하고 악성 코드 실행을 방지한다. 

 

4. JIT

: 일부 JVM 구현에서는 JIT(Just-in-Time) 컴파일러를 사용하여

Java 바이트코드 실행을 최적화한다.

자주 실행되는 바이트코드를 기계 코드로 동적 변환한다.

 

 

 


4. 일반 컴파일러와 JIT 컴파일러

(1) 일반 컴파일러 (Java 컴파일러 javac)

- 프로그램 실행 전, 프로그램의 전체 소스 코드를 기계어로 변환함

컴파일 프로세스 중 최적화를 수행하여 결과 실행 코드의 효율성을 향상시킨다.

 

 

(2) JIT 컴파일러

- 런타임중에 작동하며

- 실행중에 필요에 따라 바이트코드 부분을 동적으로 컴파일하고 최적화한다. 

- 동적 컴파일 및 최적화 프로세스는 가장 중요하고 시간이 많이 걸리는 부분을 대상으로 하여 

프로그램의 성능을 향상시키고자 함

 


5. 런타임

- 프로그램이 활발히 실행되고 JVM에 의해 실행되는 단계를 의미한다.

컴파일된 바이트코드가 해석되고 실행되는 기간과 더불어

프로그램이 의도한 작업 및 작업을 수행하는 기간을 포함한다.

 

JIT 컴파일러는 프로그램 실행을 중단하거나 일시 중지하지 않고

프로그램이 실행되는 동안 바이트 코드의 일부를 기계 코드로 동적 컴파일을 한다.

 

 

 

 

 


6. JVM 내부 동작 원리

출처 https://pienguin.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%A4%ED%96%89-%EA%B3%BC%EC%A0%95-%EB%B0%8F-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0 , chatgpt

 

 

  1. 소스 코드 편집기에서 소스 코드로 시작합니다.
  2. Java 컴파일러(javac)는 소스 코드를 읽고 컴파일을 수행하여 바이트코드(.class 파일)를 생성합니다.
  3. JVM의 클래스 로더는 바이트코드 파일을 메모리로 로드합니다.
  4. 런타임 데이터 영역에는 바이트코드, 개체, 메서드 프레임 및 프로그램 카운터가 저장되는 메서드 영역, 힙, 스택 및 PC 레지스터가 포함됩니다.
  5. 실행 엔진은 바이트코드를 해석하거나 JIT 컴파일러를 사용하여 실행을 위해 핫스팟을 최적화된 기계 코드로 동적으로 컴파일합니다.
  6. 가비지 수집기는 메모리를 관리하고 사용하지 않는 개체가 차지하는 메모리를 해제합니다.
  7. Runtime Environment는 프로그램 실행에 필요한 리소스와 서비스를 제공합니다.
  8. 예외 처리 메커니즘은 프로그램 실행 중에 발생하는 예외를 처리합니다.
  9. 프로그램은 종료 지점에 도달할 때까지 계속 실행되고 JVM은 리소스를 해제합니다

 

 


7. JVM의 메모리 구조

: JVM은 용ㅇ도에 따라 메모리를 나누어 관리하고

3가지 주요 영역(Method area, Call stack, Heap)이 존재한다.

 

(1) Method area

-> 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스파일을 읽고 분석하여

클래스에  대한 정보를 이 곳에 저장한다.

또한 클래스 변수도 이 영역에 함께 생성된다. 

 

(2) Call stack

메서드 작업에 필요한 메모리 공간을 제공한다. 

메서드 호출 시, 해당 영역에 호출된 메서드를 위한 메모리가 생성되고

메서드 작업이 마무리되면 할당되었던 메모리 공간은 반환되어 사라진다. 

 

 

 

(3) Heap

: 인스턴스가 생성되는 공간이 힙 영역이다. 

 


 

 


참고 출처 : 자바의 정석, chatgpt

'여니의 프로그래밍 study > Java' 카테고리의 다른 글

[Java] 추상클래스 및 인터페이스  (0) 2023.05.28
[Java] 패키지 및 import  (0) 2023.05.28
[Java] 제어자  (0) 2022.07.30
[Java] 자바 기본 API  (0) 2022.07.30
[Java] 생성자, 객체 생성  (0) 2022.07.30