티스토리 뷰

Java/JAVA

JVM 메모리 구조

싸드 2015. 7. 28. 15:56

JVM 메모리 구조

1. 메모리

프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공강

*메모리 구조를 공부해야하는 이유

  • 같은 기능의 프로그램이라도 메모리 관리에 따라 성능이 자우됨
  • 메모리 관리가 되지 않는 경우 속도저하 현상이나 튕김 현상 등이 일어날 수 있음.
  • 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함.

2. 자바프로그램의 실행 구조

프로그램이 실행되기 위해서는 windows나 linux같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM:주기억장치)를 제어할 수 있어야하는다 java 이전의 c같은 대부분의 언어로 만든어진 프로그램은 이러한 이유 때문에 OS에 종속적임

java프로그램은 jvm(java vittual machine:자바가상머신) 이라는 프로그램만 있으면 실행이 가능한데 jvm이 os에게서 메모리 사용권한을 할당받고 jvm이 자바프로그램을 호출하여 실행하게 된다. os한테서는 독립되었지만 jvm이라는 프로그램에 종속적이된다(jvm을 실행시키고 다시 jvm이 프로그램을 실행시키는 방식이다 보니 os에 직접 제어받는 방식보다 속도면에서는 느리다)

일반 프로그램
 PROGRAM -> OS -> HADRWARE
자바 프로그램
 PROGRAM -> JVM -> OS -> HARDWARE

3. JVM이란?

  • Java Virtual Machine
  • Java와 OS 사이에서 중계자 역활
  • Java와 OS에 구애받지 않고 재사용을 가능하게 해 줌
  • 메모리 관리 기능(Garbage Collection)

4. 자바프로그램 실행 과정과 jvm 메모리 구조

프로그램이 실행되면 jvm은 os로부터 이프로그램이 필요로 하는 메모리를 할당 받고 jvm은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

jvm_01.jpg

  • java source : 사용자가 작성한 java 코드
  • java compiler : java 코드를 byte code로 변환시켜주는 기능
  • class loader : class파일을 메모리(Runtime data Area)에 적재하는 기능
  • Execution Engine : Byte 코드를 실행 가능하게 해석해주는 기능
  • Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

5. Runtime Data Area

jvm_02.jpg

  • Method Area, Code Area, Static Area로 불리어짐
    1. Field infomation : 멤버변수의 이름, 데이터타입, 접근제어자에 대한 정보
    2. Method Infomation : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
    3. Type Infomation : 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 변수의 경우(상수로 치환되어) 상수 풀에 값 복사
  • Stack Area
    jvm_03.jpg

    1. Last In First Out (LIFO)
    2. 메서드의 호출 시마닥 각각의 스택프레임(그 메서드만을 위한 공간)이 생성
    3. 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴값 및 연산시 일어나는 값들을 임시로 저장
    4. 메서도 수행이 끝나면 프레임별로 삭제
  • Heap Area
    jvm_04.jpg

    1. New 연산자로 생성된 객체와 배열을 저장하는 공간
    2. 클래스 영역에서 로드된 클래스만 생성가능
    3. Garbage Collector를 통해 메모리 반환
  • Permanent Generation
    -생성된 객체들의 정보의 주소 값이 저장된 공간
  • New Area
      -Eden : 객체들이 최초로 생성되는 공간
      -Survivor : Eden에서 참조되는 객체들이 저장되는 공간
    
  • Old Area : New Area에서 일정시간이상 참조되고 있는 객체들의 저장 공간
    • Native method stack area
    • 자바 외의 다른 언어에서 제공되는 메소드들이 저장되는 공간
    • Pc Register
    • Thread가 생성 될때마다 생성되는 공간
    • Thread가 어떤 부분을 어떤 명령으로 실행할지에대한기록
    • 현재 실행되는 부분의 명령과 주소를 저장

6. Garbage Collection

  1. 참조되지 않은 객체들을 탐색 후 삭제
  2. 삭제된 객체의 메모리를 반환
  3. Heap메모리의 재사용
  • Minor Garbage Collection
    1. New 영역에서 일어나는 Garbage Collection
    2. Eden 영역에 객체가 가득 차게 되면 첫번째 Garbage Collection 발생
    3. Survivor1 영역에 값 복사
    4. Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
    5. Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된객체와 Survivor1영역에 있는 객체 중 참고되고 있는 객체가 있는지 검사
    6. 참조되고 있는 객체를 Survivor2영역에 복사
    7. Survivor2 영역을 제외한 영역의 객체들을 삭제
    8. 일정시간이상 참조되고 있는 객체들을 Old 영역으로 이동
    9. 반복
  • Majar Garbage Collection
    1. Old 영역에 있는 모든 객체들을 검사
    2. 참조되지 않는 객체들을 한꺼번에 삭제
    3. Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지된다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함