728x90
자바의 컴파일 과정
- 개발자가 .java 자바 소스코드를 생성한다.
- 자바 컴파일러에 의해 .java가 컴파일되어 .class 파일로 아직 컴퓨터가 읽을 수 없는 상태인 Java bytecode로 만든다.
- 컴파일된 변환 코드를 JVM의 Class Loder로 전달한다.
- Class Loader는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area에 올린다.
- 클래스 로더의 세부 동작
- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드한다.
- 검증 : 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
- 준비 : 클래스가 필요로 하는 메모리에 할당한다.
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
- 초기화 : 클래스 변수들을 적절한 값으로 초기화한다. (static 필드)
- 클래스 로더의 세부 동작
- 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행시킨다. 이 때, 실행 엔진은 두가지 방식으로 변경한다.
- 인터프린터
- 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
- 하나하나의 실행은 빠르나, 전체적인 속도는 느리다.
- JIT 컴파일러
- 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에 바이너리 코드로 직접 실행
- 전체적인 실행속도가 인터프리팅 방식보다 빠르다.
- 인터프린터
JVM HEAP의 JAVA 1.8 전후 변화
Java 1.7 이전
Java 1.8 이후
- Perm
- Class의 Meta 정보, Method의 Meta 정보, Static 변수와 상수 정보들이 저장되는 공간
- 메모리 관리(튜닝) → Heap 영역 튜닝 + Perm 영역 별도 튜닝
- Full GC 수행 대상
- 메모리 크기
- XX : PermSize
- XX : MaxPermSize
- Metaspace
- Class의 Meta 정보, Method의 Meta 정보 저장하고 Static 변수와 상수는 Heap 영역으로 이동
- 메모리 관리(튜닝) → Native 영역 동적 조정
- Full GC 수행 대상
- 메모리 크기
- XX : MetaspaceSize
- XX : MaxMetaspaceSize
- 변화
- Perm 영역 : Heap → Native 영역
- Native 영역 : JVM에 의해서 크기가 강제 되지 않고 프로세스가 이용할 수 있는 메모리 자원을 최대로 활용한다.
- java.lang.OutOfMemoryError 가 더 보기 힘들어졌다.
- Perm 영역 : Heap → Native 영역
$ java -version
openjdk version "1.7.0_232"
OpenJDK Runtime Environment (Zulu 7.31.0.5-CA-macosx) (build 1.7.0_232-b6)
OpenJDK 64-Bit Server VM (Zulu 7.31.0.5-CA-macosx) (build 24.232-b6, mixed mode)
$ java -XX:+PrintFlagsFinal -version -server | grep PermSize
uintx AdaptivePermSizeWeight = 20 {product}
uintx MaxPermSize = 85983232 {pd product}
uintx PermSize = 21757952 {pd product}
openjdk version "1.7.0_232"
- MaxPermSize : 85,983,232 byte 즉, 82MB
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (Zulu 8.40.0.25-CA-macosx) (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (Zulu 8.40.0.25-CA-macosx) (build 25.222-b10, mixed mode)
$ java -XX:+PrintFlagsFinal -version -server | grep MetaspaceSize
uintx InitialBootClassLoaderMetaspaceSize = 4194304 {product}
uintx MaxMetaspaceSize = 18446744073709547520 {product}
uintx MetaspaceSize = 21807104 {pd product}
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (Zulu 8.40.0.25-CA-macosx) (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (Zulu 8.40.0.25-CA-macosx) (build 25.222-b10, mixed mode)
- MaxMetaspaceIsze : 18,446,744,073,709,547,520 byte 즉, 17,592,186,044,415 MB
- 64 비트 프로세서가 취급할 수 있는 메모리 상한에 가까움.
-Reference
https://gyoogle.dev/blog/computer-language/Java/컴파일 과정.html
https://www.waitingforcode.com/off-heap/on-heap-off-heap-storage/read
https://coding-start.tistory.com/205
'자바 스터디' 카테고리의 다른 글
리플렉션(Reflection) ? (0) | 2021.11.17 |
---|---|
GC ( Garbage Collection ) ? (0) | 2021.11.10 |
JVM( Java Virtual Machine ) 이란 (0) | 2021.10.27 |
[Java] JVM과 자바의 버전별 변화 (0) | 2021.10.25 |
자바의 발전과정 (0) | 2021.10.21 |