[프로그래밍 언어] Java - 구조와 동작

._.·2021년 4월 12일
0

프로그래밍 언어

목록 보기
1/4

JVM은 무엇인지 그리고 Java 에서의 메모리 관리에 대해 알아보자!

JVM (Java Virtual Machine)

Java Byte Code를 OS에 맞게 해석해주는 역할을 한다. 즉, JAVA와 OS사이에서 중개자 역할을 수행하여 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 메모리 관리, Garbage collection을 수행한다.
스택기반의 가상머신이다. (레지스터 기반 x)

구성

  • Class Loader
    : 클래스(.class파일)을 로드하고, 배치하는 작업을 수행하는 모듈. Runtime 시에 동적으로 클래스를 로드한다.

  • Execution Engine
    : 클래스를 실행시키는 역할. JVM내의 런타임데이터 영역에 바이트 코드를 배치, 이것은 실행엔진에 의해 실행된다. 자바 바이트코드(인간이 보기편한) -> 기계언어로 변환해줌

    • 인터프리터: 자바 바이트 코드를 명령어 단위로 읽어서 실행 (느리다)
    • JIT(Just - In - Time): 인터프리터의 단점 보완. 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고 이를 직접 실행하는 방식. 자주 수행하는 것만.
  • Garbage collector
    GC를 수행하는 쓰레드

동작순서

1. 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받는다 (Runtime Data Area)
2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 컴파일 하여 자바 바이트코드(.class)로 변환시킨다
3. Class Loader를 통해 class파일들을 JVM으로 로딩한다
4. 로딩된 class파일들은 Execution engine 통해 해석된다
5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실적적인 수행이 이루어진다

* 필요에 따라 Thread Synchronization, Garbage Collect 와 같은 관리작업을 수행하기도 함


(출처: https://asfirstalways.tistory.com/158)

참고: https://yaboong.github.io/java/2018/05/26/java-memory-management/
아주 정리가 잘되어 있다! 이 블로그를 참고하였다.

Stack

  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당한다.
  • thread 마다 stack 영역을 가진다.

Heap

  • Heap 영역에 모든 Object 타입(Integer, String 등)이 생성된다.
  • Heap 영역에 있는 오브젝트들을 가리키는 러퍼런스 변수가 stack에 올라간다.
  • 하나의 heap 영역만이 존재한다.
  • 문자열 저장

Garbage Collection

  • Heap 영역의 오브젝트 중, Stack 에서 도달 불가능한 오브젝트들을 제거하는것.
  • 예를 들어, String 타입의 변수에 'a'를 저장되어 있는데 추가로 'b'를 덧붙인다면, 기존의 Heap영역의 'a'에 덧붙이는것이 아니라, 더해진 문자열이 새롭게 heap영역에 저장된다.
  • 과정 (Mark and Weep)
    • Mark: 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스 하고 있는지 찾는 과정
    • Sweep: mark되어있지 않은 모든 오브젝트들을 힙에서 제거하는 과정

0개의 댓글