[CS 스터디] JDK,JRE,JVM

한주영·2023년 2월 27일
0

CS

목록 보기
2/19

JDK

컴파일 과정

자바는 OS에 독립적인 특성을 가지고있다

-> 그이유는 JVM이 있기때문

컴파일 순서

1.개발자가 자바소스코드를 작성(java)
2.자바 컴파일러가 java소스코드 파일을 읽어
바이트코드(.class)로 변환

여기서 바이트코드는 아직 컴퓨터가 읽을수있는 자바가상머신ㄴ이
읽을수있는 코드

  1. 컴파일된 코드를 JVM의 클래스로더에게 전달

  2. 클래스 로더는 동적로딩(Dynamic Loading)을 통해
    필요한 클래스들을 로딩 및 링크하여 런타임 영역 즉 JVM메모리에올림

  3. 실행엔진은 JVM메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩
    가져와서 실행, 이때 실행 엔진은 두가지 방식으로 변경
    1)인터프리터: 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행
    2)JIT 컴파일러 :인터프리터의 단점을 보완하기 위해 도입된방식

JRE(JAVA RunTime Environment)

컴퓨터의 운영체제 소프트웨어상에서 실행되고 클래스 라이브러리 및
특정 JAVA프로그램이 실행해야 하는 기타 리소스를 제공하는
소프트웨어 계층

어떤방식으로 작동하는지?

OS를 기반으로 실행되며 JAVA에 고유한 추가 리소스를 제공
운영체즈를 추상화하며 JAVA 애플리케이션을 실행하고
배포할 일관된 플랫폼을 생성

컴파일언어 vs 인터프리터 언어

컴파일 언어

컴파일러는 고급언어로 작성된 소스코드를 저급 언어로 번역하는 프로그램
고급언어는 사람이 이해하기 쉽도록 작성된 프로그래밍언어로
예시로는 C, C++, JAVA 가 있다

저급언어는 컴퓨터 내부에서 바로처리 가능한 프로그래밍언어
예시로는 기계어,어셈블리어가 있다

컴파일러를 통해 컴파일 타임에 전체 소스코드를 한번에 기계어로
변환 후에 실행파일을 만든다
컴파일러 언어는 컴파일 단계와 실행단계가 분리되어있고
단 한번만 수행한다

인터프리터 언어

컴파일 하지않고 소스코드를 한줄씩 읽어들여 실행한다
컴파일 하는 과정이 없기때문에 시간은 소요되지않으나
실행파일을 별도로 생성하지 않기때문에 실행시마다
인터프리트 과정이 반복수행되며 실행속도가 느리다

예시로는 Python, Javascript, Ruby

JVM 메모리 구조

우선 JVM 에 대해 설명하자면 JVM은 Java Virtual Machine로
자바 가상 머신이라고 부른다
자바와 운영체제 사이에서 중개자 역할을 수행하며
운영체제에 구애받지않고 프로그램을 실행할수있도록 도와줌

class Loader
JVM 내로 클래스 파일을 로드하고 링크를 통해 배치하는작업을 수행하는 모듈
Execution Engin
클래스 로더를 통해 Runtime Data Area에 배치된 바이트코드들을
명령어 단위로 실행
Garbage Collector
힙 메모리 역역에 생성된 객체들 중 참조되지않은 객체들을 탐색 후 제거하는 역할을 함
Runtime data Area
jvm의 메모리영역으로 자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는영역

Garbage Collector 동작과정

주기적으로 JVM의 힙 메모리를 점검하여 스택에서 참조하지 않는 객체를
메모리에서 해제하는 장치

동작순서

1.가비지컬렉터가 스택의 모든 변수를 스캔하며 각각 어떤 객체를 참조하고있는지 찾아서 마킹
2. Reachable Object(리스트 안에 객체, 스택 → 힙(리스트) →힙(객체))
가 참조하고 있는 객체 또한 찾아서 마킹
3. 마킹되지 않은 객체를 힙에서 제거
4. compact 하는 GC라면 단편화 된 메모리를 정리

Java8의 큰특징+ Java 11과의 큰 차이점

Java 8의 특징

Heap Permanent Generation 제거

이전에는 초기 설정시 메모리를 설정했어야하는데
(PermSize, MaxPermSize) Permanent Generation이 Metaspace로 대체되었다 Metaspace는 런타임 시 메모리 요구 사항에 따라 자체 크기를 조정할수있다

Interface Default and Static Methods

인터페에스에 디폴트 메서드와 정적메서드를 포함시킬수있다

함수형 인터페이스

하나의기능을 제공하는 단 하나의 추상 메소드를 정의하는 인터페이스가
추가되었다
@FunctionalInterface와 함께쓰인다

람다표현식

람다식은 메소드를 하나의 식으로 표현한 것을 말하고
익명함수라고 부른다
메소드의 매개변수로 전달되거나 결과로 반환될수있는 특징이있다

메소드 참조

정적메소드참조
인스턴스메소드참조
특정 유형의 객체의 인스턴스 참조

Stream API

스트림은 람다식으로 요소 처리내용만을 전달하고
반복은 컬렉션 내부에서 일어난다

Java 11

String 클래스에 새로운 메서드 추가

strip(): 문자열 앞, 뒤의 공백 제거.
stripLeading(): 문자열 앞의 공백 제거.
stripTrailing(): 문자열 뒤의 공백 제거.
isBlank(): 문자열이 비어있거나, 공백만 포함되어 있을 경우 true를 반환한다.
String.trim().isEmpty() 와 결과가 동일함.
repeat(n): n개만큼 문자열을 반복하여 붙여서 반환함.

Files 클래스에 새로운 메서드 추가

Path writeString(Path, String, Charset, OpenOption): 파일에 문자열을 작성하고 Path로 반환한다.
String readString(Path, Charset): 파일 전체 내용을 읽어서 String으로 반환하고, 파일 내용을 모두 읽거나 예외가 발생하면 알아서 close를 한다. charset을 지정하지 않으면 UTF-8이 사용된다.
boolean isSameFile(Path, Path): 두 Path가 같은 파일을 가리키며, true, 아니면 false를 반환한다.

컬렉션 인터페이스에 새로운 메서드 추가

toArray() 메소드를 오버라이딩 하는 메소드가 추가되었다
원하는 타입의 배열을 선택하여 반환할수있다

람다에서 로컬변수 Var사용

람다식에서 Var을 사용할수있다

자바파일 실행

javac 명령어를 쓰지않고도 바로java파일을 실행할수있다

profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글