"어떻게 자바 코드로 File을 포함한 다양한 입출력이 가능할까?"
"내부에서 어떻게 돌아가서 프로세스로 만들어질까?"
이에대한 궁금증을 해소하기 위해서는 운영체제 기초와 JVM 내부 동작방식을 알고 있어야 합니다.
JVM의 내부 구조를 파악한 후 어떻게 동작하는지 흐름을 파악해야 합니다. 이후 위 질문에 답변하기 위해 JNI까지 알아보겠습니다.
- Compiler
- Class File
- ByteCode
- JVM internal structure
- Class Loader
loading, linking, initializing- Execution Engine
JIT complier, interpreter, Garbage Collector- Runtime Data Area
자바 소스코드를 JVM이 읽을 수 있도록 중간단계 언어인 바이트코드로 변환하는 과정을 수행합니다.
바이트코드를 만들 때 클래스 단위로 생성하기 때문에 전체를 컴파일 할 필요가 없습니다.
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>':()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // field java/lang/System.out:Ljava/io/PrintStream;
3: lde #3 // String HelloWorld!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
Hello.class는 바이트 코드 이외에 여러 정보들이 들어있는 통합 파일입니다.
Loading
.Class
File들을 Run-time Data Area 메모리 내부의 Method
로 로드하는 역할을 맡습니다..Class
File의 Bytecode를 읽어서 적절하게 배치합니다.이 작업이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 heap
영역에 저장합니다.
-> reflection
기술 사용가능
"명령어를 저장한다."
Linking
Verifying
Preparing
Resoving
동적 바인딩
이 발생합니다. 다형성
을 구현할 수 있게 하는 본인입니다."레퍼런스를 연결한다."
Initializing
"static 초기화"
BootStrap Class Loader
네이티브 코드로 작성되어 있습니다.
JVM을 처음 시작할 때 실행되며 java.lang
패키지 등의 JVM 실행에 필요한 필수 클래스들을 로딩합니다.
Extension Class Loader
-> Platform Class Loader
java.lang.ClassLoader
의 인스턴스입니다.
java SE platform API 등 자바에서 기본적으로 제공해주는 클래스를 로딩할 때 사용합니다.
Bootstrap Class Loader
를 부모로 가지고 있습니다.
Application Class Loader
-> System Class Loader
java.lang.ClassLoader
의 인스턴스입니다.
유저가 작성한 클래스를 로딩할 때 사용됩니다.
Platform Class Loader
를 부모로 가지고 있습니다.
클래스 로딩이 끝나면,
클래스 타입의 인스턴스를 만들어서 heap에 저장하므로 __.class
을 통해 인스턴스를 가져올 수 있습니다.
자세한 동작은 리플렉션 포스팅을 참고해주세요.
클래스 수준의 정보를 저장합니다.
다른 영역에서도 공유할 수 있습니다.
모든 프로그램는 운영체제 내에서 동작하도록 되어있습니다.
JVM을 통해서 만들어진 프로세스도 마찬가지입니다.
자바 코드를 컴파일한 바이트 코드를 JVM이 해석하여
운영체제 및 CPU가 이해할 수 있는 코드로 변경하기 때문에
File 등을 자바코드 만으로 조작할 수 있습니다.
Java 혁신의 숨은 공신, JVM의 구조와 동작 원리 - 개발장
"[Java] 참조 타입과 참조 변수" - 불곰
"JVM Internal" - James D Bloom
JVM Internal - Naver D2
JVM stack과 frame
더 자바, 코드를 조작하는 다양한 방법 - 백기선
자바의 실행 과정 - pond1029
10분 테코톡 JVM Memory Layout - 어썸오
스택 기반 VM과 레지스터 기반 VM - 쿠키
Java의 메모리 구조_기본구조[1/3] - 코데방
Java 프로그램의 실행원리(feat. JVM) - ikjo