1. 메모리
- 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간
* 메모리구조를 공부하는 이유
- 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우됨.
- 메모리 관리가 되지 않은 경우 속도저하 현상이나 튕김 현상 등이 일어날 수 있음.
- 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함.
2. 자바 프로그램의 실행구조
- 프로그램이 실행되기 위해서는 windows나 linux같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모 리(RAM : 주기억장치)를 제어할수 있어야 한다.
- java이전의 c같은 대부분의 언어로 만들어진 프로그램은 이러한 이유때문에 OS에 종속되어 실행되게 되어 있었다.
- java프로그램은 JVM(Java Virtual Machine : 자바가상머신)이라는 프로그램만 있으면 실행이 가능하다.
- JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 자바프로그램을 호출하여 실행하게 된다.
- OS에서는 독립되었지만 JVM이라는 프로그램에 종속적이게 된다.
- (JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에 직접 제어받는 방식보다는 속도면에서 는 느리다는 단점을 가진다)
JVM 이란?
- Java Virtual Machine(자바 가상 머신)
- c, c++ 같은 경우 프로그래머가 직접 메모리 관리를 해줘야 한다. 그 역할을 자바 가상 머신이 대신 해준다.
- JAVA 와 OS 사이에서 중계자 역할
- JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 줌
- 메모리 관리 기능(Garbage Collection)
JVM(java.exe)은 무엇을 하는가
- 메모리를 할당한다.
- bytecode를 interpreter 형태로 OS에 맞추어 번역, 실행한다.
- 번역, 실행 시 최적화를 수행한다.
3. 자바프로그램 실행 과정과 JVM메모리 구조
- 프로그램이 실행되면, JVM은 OS으로부터 이 프로그램이 필요로 하는 메모리를 할당받고,
- JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
- JVM은 크게 3부분으로 나눌 수 있다.
- 클래스 파일을 로딩한 뒤 검증하고 초기화하는 Class loader subSystem
- 클래스 파일을 저장하는 Runtime DataArea - (method area, heap, java stacks, pc registers, native method stacks의 5가지 영역으로 나누어진다)
- 클래스 파일(바이트코드)를 플랫폼에 맞는 기계어로 변환시켜 실행하는 Execution engine 이다.
- JAVA Source : 사용자가 작성한 JAVA 코드
- JAVA Compiler : JAVA 코드를 Byte Code로 변환시켜 주는 기능
- Class Loader : Class파일을 메모리(Runtime Data Area)에 적재하는 기능
- Exeution Engine : Byte Code를 실행 가능하게 해석해주는 기능
- Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
* 컴파일러(javac.exe)의 역할
① 사용자가 생성한 클래스 코드의 문법을 체크한다.
② 사용자가 생성한 클래스 코드에 컴파일러가 추가적으로 필요한 코드와 새로운 문법 코드를 삽입한다.
- java.lang package의 import 기능 등 사용된 클래스들의 전체 패키지 경로를 식별
- 상속이 없으면 object 기본 상속
- 생성자가 없으면 기본생성자 삽입
- 모든 메서드(생성자포함)에 첫번째 매개변수 this 추가
- interface 라면 메소드에 public abstract 처리
- Java 최신 버전의 문법 코드로 변경
③ 기본적인 최적화 작업을 수행
④ bytecode로 변환
4. Runtime Data Area
① 클래스 영역 = 메서드 영역
- Method Area, Code Area, Static Area 로 불리어진다.
1. Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
2. Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
3. Type Information : - Type의 속성이 Class인지 Interface인지의 여부 저장
- Type의 전체이름(패키지명+클래스명)
- Type의 Super Class의 전체이름 (단, Type이 Interface이거나 Object Class인 경우 제외)
- 접근 제어자 및 연관된 interface의 전체 리스트 저장
4. 상수 풀(Constant Pool)
- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)
- 문자 상수, 타입, 필드, Method의 symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장
5. Class Variable
- Static 변수라고도 불림
- 모든 객체가 공유 할 수 있고, 객체 생성 없이 접근 가능
6. Class 사용 이전에 메모리 할당
- final class 변수의 경우(상수로 치환되어) 상수 풀에 값 복사
② 스택 영역

- Last In First Out (LIFO)
- 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성
- 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수,
리턴 값 및 연산 시 일어나는 값들을 임시로 저장
- 메서드 수행이 끝나면 프레임별로 삭제
③ 힙 영역
- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만 생성가능
- Garbage Collector를 통해 메모리 반환
④ Native method stack area
- 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간 ex) (c , c++)
⑤ PC Register
- Thread가 생성 될 때마다 생성되는 공간
- Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
- 현재 실행되는 부분의 명령과 주소를 저장
5. Garbage Collection
- 참조되지 않은 객체들을 탐색 후 삭제
- 삭제된 객체의 메모리를 반환
- Heap 메모리의 재사용
① Minor Garbage Collection
1. New 영역에서 일어나는 Garbage Collection
2. Apple영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection 발생
3. Apple1 영역에 값 복사
4. Apple2 영역을 제외한 나머지 영역의 객체들을 삭제
5. Apple영역과 Apple1영역의 메모리가 기준치 이상일 경우, Apple 영역에 생성된
객체와 Apple1영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
6. 참조되고 있는 객체를 Apple2 영역에 복사
7. Apple2 영역을 제외한 영역의 객체들을 삭제
8. 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
9. 반복
② Major Garbage Collection (Full Garbage Collection)
1. Old영역에 있는 모든 객체들을 검사
2. 참조되지 않은 객체들을 한꺼번에 삭제
3. Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지
댓글