컴파일(Compile)과 런타임(Runtime)
1) 컴파일(Compile)이란?
- 개발자가 프로그램을 위해 작성한 소스코드를 다른 프로그램이나 기계(H/W)가 처리하기 용이한 형태로 바꾸는 과정을 말한다.
컴파일 에러
- 컴파일 에러는 프로그램이 컴파일링되는 과정에서 발생하는 에러로 일반적으로 컴파일 에러 발생시 컴파일러는 문제를 일으킨 소스코드라인을 지적해준다.
- Syntax Error
- Type 체크 에러
- 파일 참조 오류
2) 런타임(Runtime)이란?
- 컴파일 과정을 마친 컴퓨터 프로그램이 실행되고 있는 환경 또는 동작되는 동안의 시간을 말한다.
런타임 에러
- 소스코드가 이미 실행가능한 프로그램으로 성공적으로 컴파일이 되었더라도 여전히 프로그램의 실행중에 버그를 일으킬 수 있다. 이렇게 프로그램의 실행중에 발생하는 형태의 오류를 런타임 에러라고 한다.
- 런타임 에러의 종류
- 0 나누기 오류
- Null 참조 오류
- 메모리 부족 오류
3) 컴파일의 흐름 및 JAVA 가상 머신의 구성
- 개발자가 자바 소스 코드(.java)를 작성
- 자바 컴파일러(javac)가 자바 소스 코드파일 컴파일 수행
- 자바 바이트코드(.class) 파일 생성
- OS는 non-Readable, JVM은 Readable
- 바이트 코드의 명령어는 1바이트 크기의 opcode와 추가 피연산자로 구성
- 컴파일된 바이트 코드를 JVM의 클래스 로더에 전달
- 클래스 로더가 클래스 파일을 JVM 내부로 로딩, 파일을 분석하여 런테임 데이터 영역에 배치
- 동적 로딩을 수행하므로 런타임 시점이 되어야 모든 코드가 JVM과 링크됨
- 클래스 로더 세부 동작
- 로드 : 바이트 코드 파일을 가져와서 JVM 메모리에 적재
- 검증 : 자바 언어 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
- 준비 : 클래스가 필요로 하는 메모리 할당 (필드, 메소드, 인터페이스 등)
- 분석 : 클래스의 Constatnt Pool 내에 저장된 모든 Symbolic Reference를 Direct Reference로 변경
- 초기화 : 클래스 변수를 적절한 값으로 초기화(static)
- 실행 엔진(Execution Engine)은 JVM 메모리에 적재된 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행함, 실행 방식은 두 가지로 나뉨
- 인터프리터 : 바이트 코드 명령어를 하나씩 읽고 해석하고 실행, 명령어 실행 단위 시간은 빠르나 전체적인 실행 속도는 느림
- JIT(Just-In-Time) 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입되었으며 바이트 코드 전체를 컴파일하여 기계어로 변경한 후 해당 메소드를 더 이상 인터프리팅하지 않고 바이너리 코드로 직접 실행, 전체 실행 속도는 빠르나 초기 변환 비용이 발생
가비지 컬렉터(Grabage Collector)
- 참조되지 않는 객체들을 탐색 후 삭제
- 삭제된 객체의 메모리 반환
- 힙 메모리 공간 확보(다른 공간의 경우도 확보할 경우 있긴 함)
'📕 Programing > Java' 카테고리의 다른 글
[Java] Java 날짜 포맷 변경 방법 (0) | 2024.11.30 |
---|---|
[Java] 함수형 프로그래밍과 람다식 (0) | 2023.05.02 |
[Java] equals() / hashcode() (1) | 2023.04.30 |
[Java] SFTP 사용하여 파일 업로드 (0) | 2023.02.14 |
[Java] 객체의 특정 값으로 오름|내림 차순 정렬 (Comparable 사용) (0) | 2022.04.27 |