본문 바로가기

개발

[Java] Java 프로그램 실행 과정과 JVM(Java Virtual Machine) 메모리 구조

java class 컴파일에 대한 이미지 검색결과


프로그래머가 작성한 .java 코드는 JVM이 이해할 수 없는 고수준의 언어이기 때문에 저수준의 언어로 컴파일 과정을 거쳐야한다.

###.java 파일을 컴파일하면 ###.class 파일로 변경되고 이는 "bytecode"라고 불리는 저수준의 실행가능한 기계어로 변경된다.

(bytecode 는 JVM이 이해하고 실행 할 수 있다.)




다음은 JVM의 메모리 구조이다 각 영역의 기능은 다음과 같다.

  • Class area(=method area, code area, static area) : 클래스의 필드, 메서드, 타입, 상수풀, static 변수 등의 정보가 저장된다.

  • Stack area : 메서드 호출 시마다 스택 프레임(그 메서드만을 위한 공간)이 생성. 메서드 안에서 사용되어지는 값들 저장(매개변수, 지역변수, 이전 함수로 돌아갈 주소값 등..) 메서드 수행이 끝나면 프레임별로 삭제된다.

  • Heap area : new 연산자로 생성된 객체와 배열을 저장하는 공간. 클래스 영역에서 로드된 클래스만 생성 가능하다.

  • Native method area : 자바 외의 다른 언어(C/C++)에서 제공되는 메서드들이 저장되는 공간이다. Java는 플랫폼 독립적인데 그 이유는 각 OS별로 JVM에 수행하는 작업을 모두 네이티브 언어로 구현해 놓았기 때문이다. 이러한 네이티브 메서드들이 이곳에 상주한다.

  • PC Register : Thread가 생성 될 때마다 생성되는 공간이다. Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대해 기록하고 현재 실행되는 부분의 명령과 주소를 저장한다.


※String Constant pool

  • 문자열은 new 키워드로 만들수도 있고 리터럴을 사용할 수 도 있다.

  • 하지만 생성방법에 따라 실제 저장되는 메모리의 위치가 다르다.

  • new 로 생성하면 힙영역에 저장되고 리터럴을 사용하면 String constant pool이라는 곳에 저장된다.

  • String constant pool에선 동일한 문자열이 같은 포인터를 참조하도록 한다.


'개발' 카테고리의 다른 글

Vue.js 를 활용하여 간단한 달력 만들기  (1) 2018.11.15
Chapter4 Trees and Graph  (0) 2018.10.29
Chapter3 Stacks and Queues  (0) 2018.10.26
Chapter2 Linked Lists  (0) 2018.10.24
Chapter1 Arrays and Strings  (0) 2018.10.24