반응형
일반프로그램 : OS에서 실행 (Program <-> OS <-> Hardware)
Java 프로그램 : JVM에서 실행(JVM은 OS에 종속적) (Java Program <-> JVM <-> OS <-> Hardware)
JVM이란?
- Java Virtual Machine
- Java와 OS 사이에서 중계자 역할
- Java Program이 OS에 구애받지 않고 실행될 수 있게 해줌
- 메모리 관리 기능(Garbage Collection)
JVM 메모리 구조
- Java Source : 사용자가 작성한 Java 코드(.java)
- Java Compiler : Java 코드를 Byte Code(.calss)로 변환시켜주는 기능을 함
- Class Loader : Class 파일을 메모리(Runtime Data Area)에 적재시켜주는 기능을 함
- Byte Code(.class) 파일을 JVM에 class 로드하고 Link 작업을 통해 배치 등 일련의 작업을 수행. 또한 런타임시 class를 load 한다.)
- Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
- Runtime Data Area에 배치된 Byte Code(.class)들을 명령어 단위로 실행시킨다.
- Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
- Garbage Collector : 어플리케이션이 생성한 객체의 생존 여부를 판단하여, 더 이상 참조되지 않거나 null인 객체의 메모리를 해체시켜 메모리 반납을 한다. (Heap 메모리 재사용)
- Minor Garbage Collection((Heap Area) New/Young 영역에서 일어나는 Garbage Collection)
- Eden 영역에 객체가 가득차게 되면 첫 번째 Garbage Collection 발생
- Survivor0 영역에 값 복사
- Survivor0 영역을 제외한 나머지 영역 객체 삭제
- Eden 영역과 Survivor0 영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된 객체와 Survivor0 영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
- 참조되고 있는 객체들은 Survivor1영역에 복사
- Survivor1영역을 제외한 영역의 객체들을 삭제
- 일정시간이상 참조되고 있는 객체들을 Old 영역으로 이동
- 반복
- Major Garbage Collection(Full Garbage Collection)
- (Heap Area) Old 영역에 있는 모든 객체들을 검사
- 참조되지 않은 객체들을 한꺼번에 삭제
- Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지
Runtime Data Area
- Method(Static) area
- JVM이 읽어들인 클래스, 인터페이스에 대한 런타임 상수 풀, 메소드와 필드, Static 변수, 메소드 바이트 코드 등을 보관
- Field Information
- 멤버변수 이름, 데이터타입, 접근 제어자에 대한 정보
- Method Information
- 메서드 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
- Type Information
- Type의 속성이 Class인지 Interface인지 여부 저장
- Type의 전체이름(패키지명 + 클래스명)
- constant pool(상수 풀)
- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)
- 문자 상수, 타입, 필드, Method의 Symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장
- Heap Area
- 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 메모리 영역
- New 연산자를 통해 생성된 객체, 또는 인슽턴스와 배열 저장
- JVM이 관리(Garbage Collector를 통해 메모리 반환)
- Young Generation(Eden, Surv1, Surv2) (위에는 0,1 로 되어있지만 숫자는 크게 상관 없는 듯 하다.)
- Java 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간
- 시간이 지남에 따라 우선순위가 낮아지면 Old 영역으로 옮겨진다. (객체가 사라질 때 Minor GC가 발생)
- Old Generation
- Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어서 저장되는 영역
- 이 영역에서 객체가 사라질 때 Major GC(Full GC)가 발생
- Pem(Permanent)영역
- Class Loader에 의해 Load되는 class, method 등에 대한 Meta 정보가 저장되는 영역으로 JVM에 의해서 사용된다.
- Refelection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용
- Stack Area
- Last In First Out(LIFO) 선입후출 구조
- 메서드 호출시 생성되는 스레드 수행정보를 기록하는 Frame 생성
- 메서드 안에서 사용되는 값들 저장(메서드의 정보, 매개변수, 지역변수, 연산 중 발생하는 임시 데이터 저장)
- 메서드 수행이 끝나면 프레임별로 삭제
- PC Register
- 현재 수행중인 JVM 명령 주소를 갖는다.
- 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행
- CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장
- Native Method Stack
- 자바 외의 다른 언어에서 작성된 네이티브 코드를 위한 Stack
- JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택
참고한 주소
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] 자바7 try-with-resources문, multicatch 문 (1) | 2018.07.08 |
---|---|
[JAVA] 컬렉션프레임워크(CollectionFramework) 1 (0) | 2018.07.02 |
[JAVA] RSA를 이용한 전자서명 및 복호화 (0) | 2018.06.13 |
[JAVA] Comparable, Comparator 정렬 (0) | 2018.04.09 |
[JAVA] 명명규칙 (0) | 2018.04.08 |