1. Java 기초 상식
JVM(Java Virtual Machine)은 자바로 작성된 프로그램을 실행하는 데 사용되는 가상머신.
JVM은 자바 어플리케이션을 바이트코드로 변환하고, 이 바이트코드를 OS(운영체제)에 상관 없이 실행할 수 있게 함.
이렇게 함으로써 자바는 플랫폼 독립적인 특성을 가짐.
2. Java의 장점
* 플랫폼 독립적
- 자바 어플리케이션은 한 번 작성하면 어떤 플랫폼이든 실행 가능.
- JVM이 여러 OS에서 구현될 수 있기 때문.
- 타 언어는 언어에 맞는 환경에 따라 빌드를 다르게 해야 하지만 자바는 jar, war 파일을 OS 상관없이 JVM 위에서 동작.
* 메모리 관리
- JVM은 가비지 컬렉션(GC)을 통해 메모리 관리를 수행하기에 개발자가 메모리를 직접 관리할 필요가 없음.
* 보안
- JVM은 클래스 로더, 바이트코드 검증을 통해 안전한 실행 환경 제공.
- 이를 통해 악성코드로부터 시스템 보호 가능.
3. Java의 단점
* 느린 실행 속도
- JVM을 사용하면 추가적인 오버헤드가 발생하여 네이티브 코드에 비해 상대적으로 느린 실행 속도를 보임.
* 더 많은 메모리 소비
- JVM이 가비지 컬렉션과 같은 메모리 관리 기능을 수행하면서 더 많은 메모리를 사용할 수 있음.
* 추가 적인 시간 소요
- JVM을 시작하고 클래스를 로드하는 과정에서 추가적인 시간 소요.
4.JDK, JRE, JVM의 구분
* JDK (Java Development Kit)
- 자바 언어를 사용하여 프로그램을 개발하기 위한 도구 모음.
- JRE와 JVM을 포함하며, 컴파일러 (javac), 디버거, 자바 라이브러리, 문서 생성 도구 (javadoc) 등을 포함.
- 개발자는 JDK를 사용하여 자바 프로그램 작성, 컴파일, 테스트 및 디버깅을 할 수 있음.
* JRE (Java Runtime Environment)
- 자바 프로그램을 실행하기 위한 환경 제공.
- JVM과 자바 클래스 라이브러리로 구성되어 있음.
- 사용자는 JRE를 통해 자바 애플리케이션을 실행할 수 있음.
- 개발 과정이 아닌 자바 프로그램 실행을 위한 환경을 제공하기 때문에 개발 도구는 포함되지 않음.
* JVM (Java Virtual Machine)
- 자바 프로그램의 실행을 담당하는 가상 머신.
- 자바 코드 컴파일 후 생성된 바이트 코드를 기계어로 변환하여 실행하고 이 자바코드가 여러 플랫폼에서 동일하게 작동할 수 있는 중립적인 환경을 제공.
- 자바로 작성된 프로그램은 JVM이 설치된 모든 운영 체제에서 실행 가능.
5. JAR, WAR, EAR의 구분
* JAR (Java Application Resource or Java Application Archive)
- 자바 애플리케이션과 관련된 클래스 파일, 메타데이터, 리소스 파일 등을 하나의 압축 파일로 묶은 것.
- 자바 애플리케이션을 쉽게 배포하고 설치할 수 있도록 함.
- 자바 라이브러리를 포함할 수 있어, 재사용 가능한 코드 모듈을 효율적으로 관리 가능.
- JRE만 있어도 실행 가능. (java -jar 프로젝트명.jar)
* WAR (Web Application Resource or Web Application Archive)
- WAR 파일은 웹 어플리케이션과 관련된 파일들을 하나의 압축 파일로 묶은 것.
- JSP, Servlet, 클래스 파일, XML 설정 파일, 웹 리소스 (HTML, CSS, 자바스크립트, 이미지 등) 등 웹 애플리케이션 구성 요소 포함.
- WEB-INF, META-INF 같은 사전 정의된 구조를 사용함.
- 실행하려면 별도의 웹 서버 (WEB)나 웹 컨테이너 (WAS)가 필요.
* EAR (Enterprise Application Resource or Enterprise Application Archive)
- 자바 기반의 엔터프라이즈 애플리케이션을 패키징 하는 데 사용되는 파일 형식.
- 웹 애플리케이션 (WAR 파일), EJB (Enterprise Java Bean) 모듈, 자바 어플리케이션 (JAR 파일) 및 관련 리소스를 포함하며, 이들은 각각 서로 다른 계층의 구성 요소를 나타냄.
- 여러 모듈과 리소스가 포함된 대규모 엔터프라이즈 애플리케이션을 하나의 파일로 통합하여 배포하고 관리 가능.
- 주로 자바 EE 애플리케이션 서버에서 사용되며, 서버 관리자는 EAR 파일을 통해 애플리케이션의 배포와 관리를 용이하게 함.
6. 자바 라이프사이클
(1) 소스코드 작성
- 개발자는 텍스트 에디터를 사용하여 자바 소스 코드 (.java)를 작성.
- 작성된 소스코드는 컴파일 과정을 거쳐 .class로 변경될 것.
- 소스코드를 작성할 때는 자바 언어의 표준 라이브러리 (Java Standard Library)를 활용하거나 사용자 정의 라이브러리를 사용하여 재사용성을 높일 수 있음.
(2) 컴파일
- 소스코드의 구문 및 의미를 분석하여 바이트 코드 (.class)로 변환.
- 이 과정에서 자바 컴파일러의 문법 분석기는 자바 코드의 구문을 검사하고, 올바르게 작성되었는지를 검증함.
- 자바 소스 코드가 다른 클래스나 라이브러리를 사용하는 경우, 이를 참조할 수 있도록 해당 클래스나 라이브러리를 검색 (Classpath).
(3) 클래스 로딩
- 클래스 로더는 JVM의 일부로, .class 파일을 메모리에 로드하는 역할.
- 개발자가 클래스 로더의 역할을 알게 되면, 자바와 스프링 구조를 디테일하게 파악 가능.
- 클래스 로더는 클래스를 로드한 후, 링크하고 초기화 된다.
- 링크는 클래스나 인터페이스의 레퍼런스를 해결하고, 필드와 메소드를 준비하는 과정을 의미함.
- 초기화는 스태틱 (static) 블록을 실행하고, 스태틱 변수를 초기화하는 과정을 의미함.
- 클래스 로더는 로드되는 클래스의 종류에 따라서 우선 순위를 다르게 부여하고 부트스트랩 클래스 로더, 확장 클래스 로더, 시스템 클래스 로더로 JVM에 내장되어 있으며, 사용자 정의 클래스 로더로 구분할 수 있음.
- 부트스트랩 클래스 로더: JVM을 시작하면 부트스트랩 클래스 로더를 이용하여 기본적으로 제공되는 자바 클래스를 모두 로드함. 대표적으로 JVM 핵심 라이브러리인 rt.jar가 있음. 부투스트랩 클래스 로더는 JDK에 내장되어 있고 가장 먼저 클래스를 로드하는 역할 담당.
- 확장 클래스 로더: 표준 클래스 로더와 시스템 클래스 로더의 중간 단계에 해당함. JDK가 설치된 경로에 있는 클래스들을 로드하는 등 플랫폼별로 클래스를 로드함.
- 시스템 클래스 로더: 앱 개발자가 작성한 클래스를 포함하는 애플리케이션 클래스를 로드함. 확장 클래스 로더의 하위 단계에 해당하며, 클래스 패스에 지정된 경로에 있는 클래스들을 로드함. 이 때, 애플리케이션 클래스 패스에 있는 클래스 파일을 검색하고 없을 시 에러를 발생 시킴.
- 추가로, 라이브러리의 jar 파일은 시스템 클래스 로더와 확장 클래스 로더 그리고 사용자 정의 클래스 로더 중 하나에 의해 로드되지만, 일반적으로 시스템 또는 확장 클래스 로더에 의해 로드됨. 이 때, 시스템 클래스 로더는 JRE의 라이브러리 디렉터리 (lib/)와 애플리케이션 클래스 패스를 검색하며, 확장 클래스 로더는 JRE의 확장 디렉토리 (ext/)를 검색함.
(4) 바이트코드 검증
- 클래스 로더는 바이트 코드를 로딩한 후, JVM 내부에서 안전성과 보안성을 보장하기 위한 과정으로 바이트 코드의 구문 및 의미를 분석하고 유효성을 검증함.
- 이 과정에서 JVM은 스택을 검사하고, 사용되지 않는 로컬 변수를 제거하는 등의 작업을 수행함.
- 유효하지 않은 바이트 코드는 JVM에서 실행되지 않으며, 실행 중 예기치 못한 오류가 발생 가능.
(5) Just-In-Time
- 자바 바이트코드를 실행하는데, 일반적으로는 인터프리터 방식으로 동작함.
- 인터프리터 방식은 바이트 코드를 한 줄씩 읽어들이면서 실행하는 방식으로, 실행 속도가 느리다는 단점 있음.
- 이를 해결하기 위해 Just-In-Time 컴파일러 (JIT Compiler)를 도입하여 속도 저하 문제를 보완함.
- JIT Compiler는 인터프리터 방식으로 바이트 코드를 실행할 때, 실행 속도가 느린 부분을 파악하여 해당 부분을 native code로 변환하고, 이후에는 인터프리터 대신에 native code를 직접 실행하는 방식으로 동작함.
(6) 실행
- 실행 전까지의 과정을 통해 변환된 기계어 코드는 JVM에서 실행됨.
- 이 때, JVM은 자바 Thread를 생성하여 여러 작업을 동시 처리할 수 있으며, Thread는 동기화된 코드를 실행하거나, I/O 작업을 수행할 때 유용함.
- JVM은 자바 언어에서 제공하는 가비지 컬렉터(Garbage Collector)를 사용하여 메모리 누수를 방지함.
(7) 메모리 관리
- JVM은 자바 프로그램에서 사용하는 메모리를 관리함.
- 이 과정에서 메모리 할당, 해제, 가비지 컬렉션 등을 수행하여 자원의 효율성을 높이고, 메모리 누수 등의 문제를 방지함.
- JVM은 메모리를 Stack과 Heap으로 구분하여 관리함.
- Stack은 지역 변수와 메소드 호출을 위한 메모리를 할당함.
- Heap은 객체와 배열 등을 위한 메모리를 할당함.
(8) 종료
- 자바 프로그램이 실행을 마치면, JVM은 프로그램에서 사용한 자원을 해제하고 종료됨.
- 사용한 자원에는 파일, 네트워크 연결, 데이터베이스 커넥션 등이 포함됨.
- JVM의 가비지 컬렉션은 일정 시간 동안 사용되지 않는 객체를 메모리에서 해제함.
참고
https://yozm.wishket.com/magazine/detail/1979/
'Programming > Java' 카테고리의 다른 글
JAVA 버전별 특징 (0) | 2023.06.04 |
---|---|
JSON 파싱 2020. 06 .24 (0) | 2020.06.29 |
국립국어원_HTTP적용 2020. 06 .24 (0) | 2020.06.29 |
HttpClient 또오해영 (0) | 2020.06.29 |
우리말샘 API 2020. 06 .24 (0) | 2020.06.29 |