JVM

곽동현·2022년 9월 13일

JAVA

목록 보기
1/6
post-thumbnail

Java Programming Language?

  • 썬 마이크로시스템즈(Sun Microsystems, Inc.)에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어이다.

  • 자바는 운영체제에 독립적인 언어이다.

  • 상속, 캡슐화, 다형성이 적용된 순수한 객체지향언어

  • 자동 메모리 관리가 가능하다. 가비지 컬렉터가 자동적으로 메모리를 관리, 개발자가 메모리를 따로 관리하지 않아도 된다.

  • 네트워크와 분산 처리 지원: 풍부하고 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 개발할 수 있도록 지원한다.

  • Multi thread 지원 : 멀티 스레드를 시스템과 관계없이 구현이 가능하다. 또한 여러 스레드에 대한 스케줄링을 자바 인터프리터가 담당한다.


JVM?

자바 가상 머신, 애플리케이션을 클래스 로더를 통해 읽어들여 API와 함께 실행한다. 새로운 가상 환경을 띄워 동작할 수 있기 때문에 OS에 상관없이 동작이 가능하다.
자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

JVM과 다른 언어와의 차이

일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 비해 Java 애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석되기 때문에 속도가 느리다는 단점을 가지고 있다.
하지만 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차가 많이 감소했다.
또한 내가 생성한 파일을 컴파일하고 나온 바이트코드들이 OS마다 다르기 때문에 Window에서 컴파일한 바이트코드들은 리눅스에선 정상작동을 하지 않습니다. 이 문제를 해결하기 위해 C나 C++은 Cross Complie 방식을 사용한다. 내가 Window에서 컴파일하지만 리눅스에서 사용을 한다면 타겟을 리눅스로 잡고 컴파일하는 것이다.


JVM 구조

클래스 로더 : .java source를 자바 컴파일러가 컴파일하면 .class 파일인 바이트코드가 생성된다. 클래스 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다.

익스큐션 엔진 : 클래스 로더에 의해 메모리에 적재된 클래스(바이트코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할

가비지 콜렉터 : 힙 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다. GC가 수행되는 동안, GC를 수행하는 스레드가 아닌 다른 모든 스레드가 일시정지 특히 Full GC가 일어나서 수초간 모든 스레드가 정지한다면 장애로 이어지는 문제가 발생할 수 있음

Runtime Data Area (JVM Memory)

  • 개별 스레드에서 관리
    PC Register : 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역

    JVM Stack : 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값이 생성되는 영역

    Native Method Stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역(C/C++ 코드)

  • 공유 스레드에서 관리
    Method Area : 클래스 멤버 변수의 이름, 데이터 타입, final 클래스 변수를 갖고있다. 프로그램 실행 중에 어떠한 클래스가 사용되면, JVM은 해당 클래스의 클래스 파워를(.class) 읽어서 분석하여
    클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다.
    클래스 변수(Class Variable - CV)도 함께 생성된다.

    호출스택(call stack, execution stack) : 메서드의 작업에 필요한 메모리 공간을 제공한다. 호출된 메서드를 위한 메모리가 할당e된다.

    Heap Area : new 키워드로 생성된 객체와 배열이 생성되는 영역,
    또한 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성되고 인스턴스변수도 함께 생성된다. (jdk 8 이상 : static 변수, string 상수 풀)

JDK : 자바 개발 키트의 줄임말(Java Development Kit)
JRE에 컴파일러, 디버거 등 개발 도구를 포함하는 프로그램

JRE : 자바 실행 환경의 줄임말(Java Runtime Environmnet)
JVM에 자바 라이브러리와 기타 파일들이 결합된 자바를 실행하기 위한 프로그램

profile
읽고 쓰며 생각합니다 💡

0개의 댓글