[java] JVM이란?

2019. 7. 8. 16:23·java

JVM

  • 자바 가상 머신(Java Virtual Machine)
  • 자바 바이트 코드를 실행하는 주체
  • Linux, Window, Mac 등 OS에 맞게 구현
  • JVM Spec에 맞춰 구현
    • Oracle, Eclipse, IBM 등 여러 회사에서 구현
      • HotSpot, OpenJ9
    • JVM Language
      • JVM에서 실행가능한 언어
      • Clojure, Groovy, JRuby, Jython, Kotlin, Scala

자바 바이트 코드

  • 자바 바이트 코드 = 클래스 파일 = .class
  • 컴파일러가 .java 파일을 .class 파일로 해석
    • 자바 컴파일러, 스칼라 컴파일러, 코틀린 컴파일러 등
  • JVM은 자바 바이트 코드를 해석해서 실행
    • Write Once, Run Everywhere

JVM 주요 모듈

  • 클래스 로더(Class Loader)
    • 자바 클래스를 메모리에 적재하는 모듈
  • 메모리 공간(Runtime Data Areas)
    • Stack, Program Counter, Natiie Method Stack는 각 스레드가 독립적으로 관리
    • Method Area, Heap은 프로그램 전역으로 관리  
    • Method Area
      • 클래스, 인터페이스의 정보를 가지고 있음
    • Heap
      • new 로 생성하는 객체의 정보
    • Stack
      • 로컬 변수 정보 
    • Program Counter
      • 현재 실행위치
    • Native Method Stack
      • 네이티브 메소드 정보
  • 실행 엔진(Execution Engine)
    • 컴파일러
    • GC 모듈

JVM 힙 메모리 구조

  • Young
    • new 로 생성되는 신규 객체의 영역.
    • Eden, S0, S1 로 구성.
    • 마이너 GC의 대상
  • Old
    • Young에서 살아 남은 객체를 저장하는 영역.
    • Full GC의 대상
  • Meta
    • 클래스 객체의 정보가 보관되는 공간
    • JDK8부터 생성. JDK7 버전까지 Permenant Generation영역(PG)이었음.
    • PG영역의 메모리 누수 방지, GC 성능 개선을 위하여 메모리 구조를 변경
    • PG영역을 Metaspace와 Compressed Class Space영역으로 기능을 분할

실행 엔진

  • 컴파일러
    • 자바 바이트 코드를 기계어로 번역
    • 인터프리터 방식에서 컴파일 방식으로 변환
    • JIT 컴파일러
  • GC
    • 마이너 GC와 풀 GC
      • 마이너 GC는 Young 영역의 데이터 정리
      • 풀 GC는 Old 영역의 데이터 정리
        • JVM을 정지하고 실행하기 때문에 성능에 많은 영향을 끼침
      • 가장 좋은 GC 방법이 존재하는 것은 아님
        • 작업의 종류에 따라 적절한 GC 방법을 선택하는 것이 필요함
    • GC의 종류
      • SerialGC
        • -XX:+UseSerialGC
        • Mark-Sweep-Compact 알고리즘을 이용
        • 살아 있는 객체를 선택(Mark)-선택되지 않은 객체를 정리(Sweep)-메모리 공간을 압축(Compact)
      • ParallelGC
        • -XX:+UseParallelGC
        • SerialGC와 동일하지만 여러개의 스레드를 이용하여 동시에 처리
      • Parallel Old GC
        • -XX:+UseParallelOldGC
        • Mark-Summary-Compaction 단계
      • Concurrent Mark & Sweep GC
        • -XX:+UseConcMarkSweepGC
        • Stop-The-World 시간이 짧지만, 다른 GC에 비해 많은 메모리와 CPU를 사용하고, Compaction 단계가 기본적으로 제공되지 않음.
      • G1GC(Garbage First) GC
        • -XX:_UseG1GC
        • 메모리를 N개의 영역으로 나누어서 할당
반응형
저작자표시 비영리 동일조건 (새창열림)

'java' 카테고리의 다른 글

[openjdk] open jdk 1.8 다운로드 및 설치  (0) 2019.10.25
[java] 가비지 콜렉션의 종류(GC: Garbage Collection)  (0) 2019.07.24
[java] 메모리 누수와 힙 덤프 분석  (0) 2019.06.05
[java] 자바의 가비지 콜렉션(GC: Garbage Collection)과 jstat을 이용한 모니터링  (0) 2019.06.04
[Java] JVM 메모리 구조 및 옵션  (0) 2019.06.04
'java' 카테고리의 다른 글
  • [openjdk] open jdk 1.8 다운로드 및 설치
  • [java] 가비지 콜렉션의 종류(GC: Garbage Collection)
  • [java] 메모리 누수와 힙 덤프 분석
  • [java] 자바의 가비지 콜렉션(GC: Garbage Collection)과 jstat을 이용한 모니터링
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    S3
    build
    java
    emr
    Linux
    파이썬
    Hadoop
    ubuntu
    Python
    정올
    airflow
    yarn
    HDFS
    오류
    Tez
    nodejs
    백준
    SPARK
    하둡
    hbase
    다이나믹
    error
    oozie
    AWS
    알고리즘
    bash
    mysql
    HIVE
    하이브
    k8s
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[java] JVM이란?
상단으로

티스토리툴바