-
자바 스터디(1주차)CS지식/java 2020. 11. 21. 16:27
JAVA : 프로그래밍 언어,
현재는 웹 어플리캐이션 개발에 가장 많은 비중을 차지하는 언어 중 하나
(취준생 입장에서.. 스프링 개발자를 많이 뽑는거 같아서 주관적인 판단일 수도 있습니다..)
▶︎JVM이란 무엇인가
JVM은 (JAVA Virtual Machine)이며 컴파일 된 바이트코드를 OS에 맞게 해석해주는 역할을 합니다.
장점 : 운영체제에 맞는 JVM만 설치하게 된다면 운영체제나 버전이 어떻든 간에
모든 운영체제에서 실행할 수 있다는게 장점 (플랫폼 독립성 및 이식성이 높음)
단점 :
1. 다른 프로그램의 실행은 하드웨어 -> 운영체제 -> 일반 프로그램 순으로 실행이 된다면
자바 프로그램의 경우 운영체제와 일반프로그램 사이에 'JVM'이라는 과정이 있기 때문에 타 프로그램에
비해 실행속도가 느리다.
2. 운영체제에 맞는 JVM을 설치해야 된다는 점에서 가상머신이 운영체제에 종속적이다.
▶︎컴파일 하는 방법
1. 소스코드 작성 (.java파일)
2. 이클립스나 인텔리제이 등 개발 툴을 통해 .java파일을 Build 작업을 하게 되면 '자바 컴파일러'의 javac라는
명령어를 통해 바이트코드로 됩니다.
▶︎실행하는 방법
1. 바이트코드로 컴파일 된 코드는 JVM에 들어가게 됩니다.
2. 이후 JVM가 들어간 바이트 코드를 해석함으로써 자바프로그램이 실행 됩니다.
.
▶︎바이트코드란 무엇인가
바이트코드는 자바 가상 머신이 이해할 수 있는 언어로 변환 된 코드를 의미한다
▶︎JIT 컴파일러란 무엇이며 어떻게 동작하는지
바이트코드를 한줄씩 읽는 인터프리터의 단전을 보완한 바이트 코드 실행엔진
인터프리터 실행 후 적절한 시점에 바이트 코드 전체를 컴파일, 이후 인터프리팅을 하지 않고 해당 코드를
직접 실행하는 것을 의미
But 이렇게 생각하면 인터프리터보다 정말 느리다고 생각할 수 있습니다. 왜냐면 전체를 컴파일 한다는건
시간적인 소요가 체감상 더 크게 느껴지기 때문입니다.
하지만 인터프리터와 달리 JIT 컴파일러는 해석된 코드를 캐시에 보관하기 때문에 반복적인 실행이 요구되는
과정의 경우 인터프리터 보다 빠른 장점이 있습니다.
그렇기 때문에
반복적인 작업이 요구되는 경우 : JIT Compiler
작업이 한번만 요구 되는 경우 : 인터프리터
가 성능이 좋다고 생각합니다.
▶︎JVM 구성 요소
일단 이걸 알아야 되는 이유는 일부 기업에서도 정보시스템 성능 저하 요인으로 JVM과 메모리 부족으로 들기 때문에
개발자로써 어느정도 알아야 한다고 생각한다.
1. 클래스로더 : 런타임 시 클래스 파일을 JVM 내부로 로딩하고, 클래스 파일을 분석한 뒤
런타임 데이터 영역에 배치
클래스 파일 중 우선 classpath라는 환경 변수에 등록 된 디렉토리 파일에 있는 클래스를 먼저 JVM에 로딩
JVM에 로딩된 클래스만 JVM에 객체로 사용이 가능합니다.
자바의 클래스 로딩은 로딩-링크-초기화 과정을 겪습니다.
1. 로딩 : 바이트 코드를 메모리로 가져오는 과정
2. 링크 : 바이트코드의 규칙, 클래스에 정의한 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비하고
해당 클래스가 참조하는 다른 클래스 로딩
3. 초기화 : 슈퍼클래스 및 정적 필드를 초기화
2. 런타임 데이터 영역 : 클래스 로더에서 분석 된 클래스 파일의 데이터를 저장 + 실행에 필요한 데이터 저장
메모리 효율적 관리를 위해 메모리 영역 (static, heap, stack, pc레지스터, native method stack)에 저장
3. 실행 엔진 : 런타임 데이터 영역에 배치된 바이트 코드를 해석하며 실행
JIT와 인터프리터 방식을 혼합하여 해석합니다.
초기 JVM은 인터프리터만 활용했지만 현재는 혼용해서 쓰고 있습니다. 인터프리터와 JIT는 위에 설명했습니다.
4. 가비지 컬렉터 : 메모리 관리 기능을 자동으로 수행하는데 보통 잘 안쓰는 객체를 우선적으로 해제시켜 메모리 부족
을 예방합니다.
<메모리 영역>
클래스(메소드, 스태틱)
- 가장 먼저 데이터 저장 되는 공간
- 클래스 로더에 의해 로딩 된 클래스, 메서드, 클래스변수 전역변수를 가져옴
- 무분별한 사용을 지향하는게 좋은편..
- 프로그램 시작부터 종료까지 메모리에 남는데 Null을 선언하면 가비지 컬렉터에 의해 오래사용하지 않을경우
해제된다.
힙
- 런타임시 결정되는 보통 자바 프로그램에서 new를 통해 주소를 할당할 때 그 주소데이터를 저장하는 공간
- 프로그램 시작부터 종료까지 메모리에 남는데 Null을 선언하면 가비지 컬렉터에 의해 오래사용하지 않을경우
해제된다.
클래스와 힙은 모든 스레드를 공유한다.
스택
- 컴파일 시 결정되는 기본형 데이터 타입
- 지역변수, 매개변수, 리턴값, 참조변수 등이 저장됨
- 메소드 호출 시 메모리에 FILO로 하나씩 실행 (스택느낌?)
- 메소드 끝날때는 LIFO로 제거
- 메소드 호출 시 각각의 스택 프레임 생성
{}나 메소드가 끝날때까지 존재함
PC 레지스터 JVM이 수행할 명령어의 주소를 저장하는 공간
<스레드가 시작할 때 생성>
네이티브 메소드 스택
- 바이트 코드가 아닌, 기계어로 작성된 코드를 실행하는 공간
- (C/C++)로 작성된 코드를 수행하기 위한 공간
- Java Native Interface를 통해 바이트코드로 변환됨
<Java Native Interface 호출 및 종료시 생성>
메소드, 힙과 달리 각 스레드 별로 스택, PC 레지스터, 네이티브 메소드 스택은 생성된다.
▶︎JDK와 JRE의 차이
JRE(Java Runtime Environment) 자바실행환경, 읽는 기능을 제공한다
JVM, Java API제공
JDK(Java Development Kit) 자바개발도구, 읽기 및 쓰기(개발) 기능을 제공한다.
JRE에서 제공을 안해주는 Java Tool, Java Compiler등을 제공(JRE에서 제공해주는 것은 당연히 포함된다)
즉 JVM < JRE < JDK 순으로 포함관계가 되어있다
참고 자료 링크
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
https://aljjabaegi.tistory.com/387
https://steady-snail.tistory.com/67
'CS지식 > java' 카테고리의 다른 글
자바 스터디(3주차) (0) 2021.01.30 자바 스터디(2주차) (0) 2020.11.21