Java 프로그래밍기초 230223 #14 Java / JVM

김춘복·2023년 2월 23일
0

Java 공부

목록 보기
17/20

Java

  • Write Once Use Anywhere 소스파일 하나만 작성하면 어디서든 사용이 가능하다.

  • JVM을 사용하여 운영체제와 독립적으로 동작할 수 있다. (어느 운영체제나 같은 형태로 실행)
    Java는 처음부터 객체 지향 언어로 개발되었다.
    자동메모리 관리 등을 지원해 안정성이 높고 역사가 길어 수많은 참고자료가 있다.

  • 하지만 실행을 위해 JVM을 거쳐야 하므로 다른 언어에 비해 실행속도가 느리고
    개발자가 일일이 예외 처리를 해줘야 하며 다른 언어에 비해 코드 길이가 길다는 단점이 있다.


Compile언어와 Interpreter언어

Compile 언어

: 소스파일 전체를 컴파일 한 후 기계어를 CPU와 메모리를 통해 읽어 바로 실행하는 언어

  • 종류 : C, C++, Java, C# ...
  • 특징 : 소스코드 파일 크기가 크면 컴파일이 오래 걸린다.
    컴파일 된 후 기계어로 바로 실행하기 때문에 실행속도가 빠르다.

Interpreter 언어

: 소스파일을 컴파일 하지 않고 Interpreter를 사용해 소스파일을 한줄씩 번역하면서 실행하는 언어

  • 종류 : Javascript, Python, Ruby
  • 특징 : 컴파일 언어처럼 목적파일이 없다.
    컴파일 없이 바로 실행되기 때문에 수정 및 디버깅이 편하다.
    Interpreter만 있으면 어디서든 실행가능해서 자유롭고 독립적이다.
    실시간으로 번역되면서 실행되기 때문에 실행속도가 느리다.

Java는 자바 컴파일러에 의해 바이트코드로 컴파일되지만 JVM에서는 인터프리터로 실행된다.
Compile 언어지만 Interpreter 언어의 특징을 동시에 가진다.


Java의 실행 과정

  1. 개발자가 자바 소스파일(.java)를 작성한다.
  2. JDK가 제공하는 javac(자바 컴파일러)를 사용하여 소스파일을 컴파일 한다.
  3. JVM의 Class Loader가 컴파일로 생성된 바이트코드(.class)를 전달받아 동적로딩을 통해 실행에 필요한 클래스들을 로딩하여 JVM내부의 Runtime Data Area에 로드한다.
  4. JVM의 Execution에 의해 기계어로 해석되어 실행된다.

Class Loader

  • .class파일은 Loading, Linking, Initializing단계를 거쳐 JVM에서 사용할 수 있게 된다.

  • 프로그램상의 모든 클래스, 변수, 메서드의 정보를 Method Area에 배치한다.

  • JVM 내부에 바이트코드를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다.

  • 동적으로 클래스를 로드하고 jar 파일 내부에 저장되어있는 클래스들을 JVM에 로드한다.

  • 동적로딩 : 처음 프로그램이 실행될 때 모든 프로그램의 주소 공간을 메모리에 로딩하는 것이 아니라, 실행 중에 필요한 데이터를 메모리에 로딩하는 방식

Execution (실행 엔진)

  • Interpreter, JIT compiler, Garbage Collector

  • Interpreter는 바이트 코드를 한줄씩 읽고 번역하는데 느리다는 단점이 있다.

  • 이를 보완하기 위해 나온 Jit 컴파일러는 Interpreter 방식으로 실행을 하다가 적당한 시점에 바이트 코드 전체를 컴파일하여 캐싱한다. 컴파일된 코드를 저장해두기때문에(캐싱) 이 코드들은 Interpreter를 안거치고 바로 실행이 되어 실행속도가 매우 빨라진다.

  • Garbage Collector는 사용하지 않는 메모리를 추적해 비워주는 기능을 한다.


JVM

JDK : Java Development Kit / 자바 개발 도구
JRE : Java Runtime Environment / 자바 실행 환경
JVM : Java Virtual Machine / 자바 가상 기계

  • JDK : JRE + Development Tools(javac(컴파일러), java, javadoc등 개발에 필요한 도구)

  • JRE : JVM + 자바 클래스 라이브러리 + 기타 파일 + 클래스로더 / JVM의 실행 환경을 구현.
    프로그램을 실행하기 전에 메인메서드를 포함하고 있는지 확인하고 있으면 JVM을 부팅

  • JVM : 자바 소스코드로 부터 만들어지는 자바 바이너리파일(.class)을 실행한다.
    자바 프로그램이 실행되는 가상의 컴퓨터.
    JVM만 설치되어 있으면, 자바 바이트 코드는 어떤 운영체제에서라도 실행될 수 있습니다.
    단, JVM은 운영체제에 종속적이므로 각 운영체제에 맞는 JVM을 설치해야 한다.


전처리과정

: 부팅이 된 JVM이 전달받은 코드를 실행시킬 때 가장 먼저 하는 일.

  1. JRE가 java.lang 패키지를 Method Area에 배치한다.
  2. import 한 패키지도 Method Area에 배치한다.
  3. 프로그램상의 작성한 모든 클래스, 변수, 메서드를 Method Area에 배치한다.
  4. static 변수와 static 메서드는 Heap Area에 배치한다?
    (라고 배웠는데 검색해보니 Method Area라고 나와서 이부분은 좀 더 알아봐야한다.)

Runtime Data Areas

: 컴퓨터에서 메모리 같은 역할을 수행하는 영역. 프로그램을 실행하여 발생하는 데이터를 저장.

1. PC Register

  • 스레드가 시작될 때마다 생성됨. 스레드마다 하나씩 존재

  • 스레드가 어떤 명령에 의해 실행되어야 할지에 대한 기록을 한다.
    현재 수행하고 있는 JVM의 명령 주소를 갖고있다.

2. Native Method Stack

  • 바이트코드가 아니라 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행하는 영역

  • 자바 이외의 언어(C,C++,어셈블리 등)로 작성된 코드를 실행할 때 여기에 할당되며 일반적인 C스택을 사용

  • Java Native Interface를 통해 바이트코드로 전환하여 저장

  • 일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역

3. Method Area (Metaspace, Static Area, Class Area)

  • 클래스 정보를 처음 메모리공간에 올릴 때 초기화 되는 대상을 저장하기 위한 공간

  • 클래스의 타입, 변수 및 메서드의 정보를 가지고 있으며 모든 쓰레드가 공유한다.

  • 런타임상수풀(Runtime Constant pool) : 상수 자료형을 저장하여 참조하고 중복을 막는다.


4. HeapArea

  • 객체(인스턴스)가 생성되는 영역. 프로그램 실행 중 생성되는 객체는 모두 여기서 생성.

Permanent Generation

  • 생성된 객체들의 주소값이 저장된 공간.
  • 클래스로더가 로드하는 클래스, 메서드 등에 대한 Meta code(정보)가 저장. JVM이 사용한다.
  • Reflection(객체를 통해 클래스의 정보를 분석)을 사용하여 동적으로 클래스가 로딩되는 경우에 사용
  • Java8 이전에는 Heap 내부에 있었지만 Java8 이후 제거되고 Native메모리 영역에 저장된다.

New/Young Generation

  • 생명 주기가 짧은 객체를 Garbage Collector 의 대상으로 하는 영역
  • Eden : 객체들이 최초로 생성되는 공간
  • Survivor 0,1 : Eden에서 참조되는 객체들이 저장되는 공간
  • Eden 영역에 객체가 가득차게 되면 Garbage Collector에 의해 Eden 영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 객체들을 삭제.

Tenured Generation

  • 생명 주기가 긴 객체를 Garbage Collector 의 대상으로 하는 영역입니다.
  • New/Young Generation 에서 일정시간 참조되고 있고 살아남은 객체들이 저장되는 공간
  • Old : 이곳의 객체들은 Garbage Collector 에 의해 삭제된다.

5. Stack Area

  • 프로그램 실행과정에서 임시로 할당 되었다가 메서드를 빠져나가면 바로 소멸이 되는 특성의 데이터들을 저장하기 위한 영역.

  • 실행되는 메서드 및 {}블럭(if문 등)에 대한 데이터가 저장.

  • 가장 처음 실행되는 main()메서드가 첫번째로 메모리에 올라가고 그 다음 실행되는 메서드들이 위에 쌓이는 구조다.

  • 쌓이는 메서드의 단위를 스택 프레임이라 부른다. 스택 프레임 내부에 스택 프레임이 생길 수있다.

  • 가장 큰 특징은 멀티스레드 환경에서 각 스레드가 고유의 스택영역을 가진다는 점이다.

profile
Backend Dev / Data Engineer

0개의 댓글