본문 바로가기
회고록/Java dataStructure&Algorithm

Java 작동 원리 (복습)

by sehunbang 2024. 4. 26.

 

JDK ( 개발 할때는 필요 하지만 실제로 자바 파일만 돌릴 거면 필요 없습니다.)

  • 자바 개발 환경으로 자바 어플리케이션을 개발하기 위해 필요한 도구를 제공한다.
  • 자바 언어를 바이트 코드로 컴파일 해주는 자바 컴파일러(javac), 자바 클래스 파일을 해석해주는 역 어셈블리어(javap) 등이 있다.
  • 자세한 내용은 Tools and Commands Reference 에서 확인이 가능하다.

 

 

JRE ( JAVA RUNTIME ENVIROMENT )

  • JRE는 자바 실행 환경으로 JVM,자바 클래스 라이브러리, 기타 자바 어플리케이션 실행에 필요한 파일들을 포함한다.

JVM ( JAVA VIRTUAL MACHINE )

자바는 platform independent - 어떤 기기에서도 돌릴수 있다는 뜻.

JVM은 자바 가상 머신으로 자바 어플리케이션을 실행하는 가상 머신이다. 실제 컴퓨터로 부터 JAVA 어플리케이션 실행을 위한 메모리를 할당 받아 Runtime Data Area를 구성한다.

  • JVM은 인터프리터와 JIT 컴파일러를 통해 바이트 코드를 각 운영체제에 맞는 기계어로 해석시켜 실행시키고, 가비지 콜렉터를 통해 어플리케이션의 동적 메모리를 관리한다.
  • 자세한 내용은 The Java® Virtual Machine Specification와 • Java Virtual Machine Guide에서 확인 가능하다.

 

 

JVM 은 어떤 환경에서 작동 하는가?

 

하드 웨어 > os > jvm ( 어떤 기기에서도 돌릴수 있다는 뜻 )

 

1. window 라고 치면 윈도우용 jvm 이 있습니다.

2. java  코드를 실행 시킬건데  하지만 byte 코드 라는 것이 필요 해요.

3. jvm 은 바이트 코드 밖에 이해 하지 못합니다

4. java 코드를 byte 코드 로 변환 시켜야 합니다.

5. 근대 개발자는 바이트 코드를 작성 할수 있나요? 아니죠 java  코드만 작성 할줄 알겠죠.

6. 그래서 컴파일러(Javac) 가 있습니다 , 코드를 byte 코드로 변환 시켜주는

 

자바 코드 => 컴파일러 (byte code 변환) => jvm 

 

그럼 큰 프로젝트 의 100개 넘는 모든 자바 파일을 다 byte code 로 변환 할가요??

No !!!!!

JVM 은 딱 하나의 파일만 실행 합니다!!!

 

첫번재 파일만 execute 합니다. -> 다른 파일들도 main 파일에 연결 되어 있어요.

(그래서 첫번째 파일을 지정 해 줘야 합니다. main 메소드 라고 하지)

public static void main (String args)

 

 

 

 

 

구조

JDK

Java Compiler (javac): 자바 코드를 byte 코드로 변환 시켜주는 컴파일러.

Javap : javap 커맨드는 어떤 바이트코드 파일이 어디서부터 나왔으며, 어떠한 필드와 메소드를 갖고 있는 파일인지를 알려주는 기능을 수행한다고 정리할 수 있겠다.

JavaDoc : JavaDoc은 Java 소스 코드에서 특정 형식의 주석을 분석하여 API 문서를 생성하는 도구입니다. JavaDoc을 사용하여 Java 클래스, 인터페이스, 메서드 등의 문서를 HTML 형식으로 생성할 수 있습니다

Java : Java 애플리케이션을 실행하기 위해 사용되는 프로그래밍 언어.

Jar : Java 애플리케이션을 패키징하는 데 사용됩니다. JAR(Java Archive) 파일은 Java 클래스 파일, 리소스 및 메타데이터를 하나의 압축된 파일로 묶는 데 사용됩니다.

JRE : JAVA RUNTIME ENVIROMENT , Java 프로그램이 실행될 때 필요한 것들을 제공.

JRE

Java 클래스 라이브러리 : Java 프로그램이 실행될 때 필요한 여러 기본 클래스들을 제공.(데이터 구조, 입출력 처리 ....).

JVM : Java 어플리케이션을 실행하는 가상 머신이다. (바이트 코드로)

JVM

Class loader 클래스 로더 : 클래스 로더는 자바 프로그램이 실행될 때 클래스 파일을 로딩하고, 이를 JVM 내부에서 사용할 수 있는 자바 클래스로 변환합니다. ram 에 올립니다.

1. 계층 구조 :  부트스트랩 , 익스텐션 클래스 로더 , 애플리케이션 클래스 로더 

부트스트랩 클래스 로더(Bootstrap Class Loader):

JVM이 시작될 때 가장 먼저 동작하는 클래스 로더입니다.

JAVA_HOME/lib 디렉토리 내에 위치한 시스템 클래스들을 로딩합니다.

Java API의 핵심 클래스들이 여기에 포함됩니다. 예를 들어 java.lang.Object, java.lang.String 등이 여기에 속합니다.

일반적으로 자바 코드에서 직접적으로 접근할 수 없습니다.

익스텐션 클래스 로더(Extension Class Loader):

부트스트랩 클래스 로더 다음으로 동작하는 클래스 로더입니다.

JAVA_HOME/lib/ext 또는 java.ext.dirs 시스템 프로퍼티로 지정된 디렉토리에서 클래스들을 로딩합니다.

JDK 확장 기능에 필요한 클래스들이 여기에 포함됩니다. 예를 들어 서드파티 라이브러리나 확장 기능들이 여기에 로딩될 수 있습니다.

애플리케이션 클래스 로더(Application Class Loader):

가장 하위에 위치한 클래스 로더로서, 애플리케이션 코드를 로딩합니다.

클래스 패스(classpath)에 지정된 디렉토리나 JAR 파일에서 클래스들을 로딩합니다.

사용자가 작성한 애플리케이션 코드와 해당 애플리케이션이 의존하는 라이브러리들이 여기에 속합니다.

https://steady-snail.tistory.com/67

 

[JAVA] JVM 동작원리 및 기본개념

JAVA라는 언어를 통해 코딩을 하고 있는 사람으로서 JAVA의 간단한 탄생배경 그리고 JAVA의 시작과 끝이라고 할 수 있는 JVM을 한 번 짚고넘어가려고 해요 우선 JAVA의 탄생배경을 좀 알고가면 이해하

steady-snail.tistory.com

2. 위임 모델 :  클래스 로더 간의 계층 구조를 나타냅니다.

 

3. 가시성 제한 : 클래스 로딩과 관련된 보안 및 격리 기능을 제공합니다

  • 부모 클래스 로더는 자식 클래스 로더가 로딩한 클래스에 접근할 수 있지만, 자식 클래스 로더는 부모 클래스 로더가 로딩한 클래스에 직접적으로 접근할 수 없습니다. 이는 클래스 로딩의 위임 모델에 따른 제한입니다.
  • 이러한 제한을 통해 부모 클래스 로더가 자식 클래스 로더로부터 보호되며, 각각의 클래스 로더가 독립적으로 동작할 수 있습니다.

4. 언로드(Unload) 불가 : 

클래스가 한 번 로딩되면 해당 클래스와 그에 의존하는 다른 클래스들은 JVM이 종료될 때까지 메모리에 남아 있습니다.

자바의 가비지 컬렉션(GC) 시스템에서 클래스 언로드를 지원하지 않기 때문입니다

안쓴이유 : 

( 클래스 로딩의 복잡성 , 보안 및 안정성 문제 , 성능 문제 ).

 

5. 이름공간 (Name Space)

프로그래밍에서 식별자(identifier)의 유효 범위(scope)를 관리하기 위한 추상적인 개념입니다. 이름 공간은 이름과 그에 해당하는 객체 또는 값들을 매핑하고, 각각의 이름이 유일하고 중복되지 않도록 보장합니다.

 

 

 

 

Runtime Data Area (런타임 데이터 영역) :

1. Pc register :

현재 스레드가 실행 중인 명령어의 주소를 가리킵니다.

스레드마다 별도로 유지되며, 스레드가 실행 중인 위치를 추적하는 데 사용

2. Jvm stack :

각각의 자바 스레드(Thread)에 대한 실행 스택을 나타냅니다. 이 스택은 메서드 호출 및 반환과 관련된 정보를 저장하고, 각각의 스레드에 대해 별도로 유지됩니다. ( 메서드 호출 및 반환 정보 저장 , 스레드 별로 별도로 유지 , 스레드의 메서드 호출 순서 관리 , 스택 오버플로우 예방 )

3. Native method stack :

( 자바 코드가 아닌 )네이티브 메서드 호출 시 사용되는 스택 영역

4. Heap :

객체 인스턴스와 배열 등의 동적 할당된 메모리가 저장

GC(Garbage Collection)의 대상이 되는 메모리 영역으로, 더 이상 사용되지 않는 객체들은 GC에 의해 정리됩니다. (Garbage collector)

5. Method area :

클래스의 메타데이터(metadata), 정적 변수(static variables), 상수(constant pool) 등이 저장됩니다.

 

Java 7 이전에서는 PermGen(Permanent Generation) 영역으로 알려져 있었으며, Java 8부터는 Metaspace로 대체되었습니다.

( Metaspace는 클래스 메타 데이터를 native메모리에 저장하고 부족할경우 자동으로 늘려주게 됩니다 )

 

5.1  Method area/Runtime Constant Pool : 

클래스의 메타데이터(metadata)를 저장하는 중요한 구성 요소입니다

 

 

 

 

Execution engine (실행 엔진) :

자바 바이트코드(Bytecode)를 기계어로 변환하고 실행하는 역할을 담당합니다.