[Java] Java 개념 정리 (JVM, JDK, Garbage Collector ...)

이석환·2024년 2월 9일
0

개념 정리

목록 보기
1/6


[Java Conceptual Diagram]

자바란 ?

The Java® programming language is a general-purpose, concurrent, object-oriented language.

Java는 컴파일이 되고, 객체 지향적이며, 매우 이식성이 높은 프로그래밍 언어다.

Java는 객체지향적인 언어로 구문은 C, C++과 유사하지만, 복잡하고 안전하지 않은 요소를 제외하고 C++에서 영향을 받아 만들어졌다.

C++에서 발생할 수 있는 메모리 관리 오류, 포인터 연산 등과 같은 위험한 기능을 제거하고 안전한 프로그래밍 환경을 제공하기 위기 만들어진 것을 의미한다.
또한, 특정 운영체제에 종속되는 C++과 달리 Java는 종속되지 않는다.

Java는 Garbage Collection을 사용하여 자동 메모리 관리를 통해 메모리 누수를 방지하고, 포인터 연산을 제공하지 않기 때문에 안전한 프로그래밍이 가능한 것이다.

객체지향 언어
기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 캡슐화, 상속, 다형성이 제공되는 언어를 의미

기능이 중심이 아닌 객체가 중심이며, 위의 특징으로 모듈 재사용이 가능해서 확장 및 요지 보수에 유리하다.

JVM

Java Virutal Machine

직역하면 자바 가상 머신으로써, 바이트코드(.class파일)를 실행시키는 가상 머신이다.
자바는 기본적으로 컴파일 언어로 컴파일 하는 경우, 바이트코드를 생성한다.
이러한 바이트 코드를 JVM이 실행시킨다.

바이트코드는 어떤 운영체제나 아키텍쳐에 종속적이지 않으며, 어디서든 실행이 가능하다.

즉, JVM은 자바 소스 코드가 컴파일 되어 만들어진 바이트코드를 각 운영체제에 맞는 기계어로 다시 번역하는 역할을 한다.
또한, Java의 장점인 메모리 관리, Garbage Collection을 수행한다.

가상 머신이란 ?
프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.

JVM의 아키텍쳐는 크게 Class Loader, Runtime Data Area, Exectuin Engine으로 구성되어 있다.

Class Loader (클래스 로더)

JVM에 .class 파일을 Load하고, 링크를 통해 배치하는 작업을 수행하는 모듈

즉, 최초에 클래스를 참조하는 경우에 해당 클래스를 로드하고 링크하는 역할을 수행

Runtime Data Area

프로그램을 수행하기 위해서 운영체제에서 할당받은 메모리 공간

  • Thread
    프로세스 내에서 실제 작업을 수행하는 주체

  • PC Register
    Thread가 시작될 때 생성된다. Thread마다 하나씩 존재하며 명령을 실행해야 할 지에 대한 기록을 한다.
    JVM은 기본적으로 스택 기반의 가상머신이다.
    CPU에 접근하지 않고, Stack에서 주소를 가져오며 그 주소를 PC Register에 저장한다.
    현재 수행중인 JVM 명령의 주소를 가지고 있다.

  • JVM Stack
    프로그램 실행 과정에서 임시로 할당되었다가 Method를 빠져나가게 되면 소멸되는 데이터들이 저장된다.
    메서드 호출마다 스택에 각각의 스택 프레임이 생성되며 수행이 끝나면 해당 프레임이 제거된다.
    호출된 메서드의 파라미터, 지역 변수 등이 저장된다.

  • Native Method Stack
    Java 이외의 언어에 제공되는 Method의 정보가 저장된다.
    Java Native Interface를 통해 바이트코드로 저장된다.
    Kernel이 자체적으로 Stack을 잡고 독자적으로 프로그램을 실행시키는 영역이다.

  • Heap
    Garbage Collection의 대상이 되는 영역이다.
    객체를 동적으로 생성하게 되면, 인스턴스가 Heap의 메모리에 할당된다.
    단, 레퍼런스 변수는 인스턴스가 아닌 포인터가 저장된다.

  • Method Area
    클래스 정보를 처음 메모리에 올릴 때, 초기화되는 대상을 저장하기 위한 영역이다.
    e.g., Field Informaiton : 멤버 변수에 대한 정보(이름, 타입, 접근 지정자, ...)
    Method Information : 메서드에 대한 정보(이름, 리턴 타입, 접근 지정자, ...),
    Type Information : Class, Interface 구분 또는 Type의 속성 이름 ...

  • Runtime Constant Pool
    상수형을 저장하고 중복을 막는 역할을 수행한다.

Execution Engine (실행 엔진)

클래스를 실행시키는 역할

Class Loader가 JVM 내의 Runtime Date Area에 바이트코드를 배치시키면, Execution Engine에 의해 실행된다.

Execution Engine은 바이트코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.
(이때, 방식은 InterPreter와 JIT가 존재)

Garbage Collector

메모리 관리 기법, Heap 영역에 배치된 객체들을 관리하는 모듈이다.
더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다.

JDK

Java Development Kit

개발자들이 Java 기반 소프트웨어를 개발하기 위한 도구들로 이루어진 패키지 혹은 SDK Kit이다.
JDK 안에는 Java 개발 시에 필요한 라이브러리, Javac, Javadoc 등의 개발 도구들이 포함되어 있고, Java 프로그램을 실행시키기 위한 JRE가 포함되어 있다.

javac : Java 컴파일러로, Java 소스를 바이트 코드로 컴파일한다.
Javadoc : Java 소스로부터 HTML 형식의 API Document를 생성한다.

JRE

Java Runtime Environment

Java를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK이다.
JVM과 Java 프로그램을 실행시킬 때 필요한 라이브러리 API를 포함하여 배포되는 패키지이다.

즉, JRE에는 Java Class Library와 Java Class Loader, JVM이 포함된다.
이외에도 자바 런타임 환경에 사용되는 property 세팅이다 리소스 파일(jar 파일)을 가진다.

하지만, 개발 관련 도구는 포함하고 있지 않기 때문에 JRE만으로 Java 파일을 컴파일 할 수 없다.

Jar: Java 클래스 파일을 압축한 Java 아카이브 파일(.jar)을 생성,관리하는 압축 프로그램

References
https://docs.oracle.com/javase/8/docs/

https://developer.mozilla.org/ko/docs/Glossary/Java

https://dev-coco.tistory.com/153

https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80

https://backendcode.tistory.com/204

https://medium.com/@mannverma/the-secret-of-java-jdk-jre-jvm-difference-fa35201650ca

profile
반갑습니다.

0개의 댓글