2011년 5월 25일 수요일

Java Memory Model

Java Memory Model

JVM(Java Virtual Machine)
Machine이라는 말이 들어가 있지만 실제로는 Software. Machine이라는 말이 들어간 이유는 JVM이 실제적으로 CPU와 같은 역할을 하기 때문이다.
Program은 CPU 위에서 돌아간다. C나 C++과 같은 프로그램 에서 Compile된 코드(native code)는 CPU에서 바로 실행이 가능하다. 하지만 Java의 Compile 결과물 “.class” 은 byte code이다. 이 byte code을 실행시키기 위한 가상적인 CPU가  JVM(Java Virtual Machine) 이다. 이와 같이 JVM을 이용하는 이유는 Program 이식성을 높이기 위함이다.

JVM Memory Model
  1. Method Area
  • JVM의 모든 Thread들이 공유하는 데이터 영역
  • Class 정보, Method 정보, 멤버변수, static 변수 저장 영역

  1. Heap
  • 프로그램 상에서 데이터를 저장하기 위해 동적(실행시간)으로 할당하여 사용하는 영역
  • “new”연산자로 생성된 객체와 배열을 저장
  • 주로 실행시간에 생성되는 객체를 저장
  • GC(Garbage Collection)으로 관리 되는 영역

  1. Java Stack
  • Method가 호출될 때마다 스택 프레임이 생성. 이것이 쌓여 스택을 구성.
  • 수행되는 Method 정보, 로컬변수, 매개변수, 연산중 발생하는 임시데이터 저장.
  • JVM은 스택영역을 실행중인 Thread에 따라 각각 구성

  1. Native Method Stacks
  • Native 메소드를 호출할 때 native Method의 매개변수, 지역변수 등을 저장

Heap Memory 구조
  1. New Generation
Young Generation이라고도 하며 새로 생성된 객체들을 위해 사용됨.
Eden Space
  • 새로(new) 생성된 모든 객체들이 위치한다.
Survivor Space 1
  • Minor GC에 의해서 Eden, Survivor 2영역의 객체 중 활성화된 객체만 이동하여 위치
  • Old Space로 이동되기 전의 객체만 위치
Survivor Space 2
  • Minor GC에 의해서 Eden, Survivor 1영역의 객체 중 활성화된 객체만 이동하여 위치
  • Old Space로 이동되기 전의 객체만 위치

  1. Old Generation
  • Survivor 1, Survivor 2 영역에서 이동해온 객체만 위치
  • Full GC의 대상이 되는 객체가 위치

  1. Permanent Generation
  • JVM 클래스와 Method 객체를 위한 영역
  1. Minor GC : New(young)영역의 GC방법
Young 영역은 Eden과 두 개의 Survivor 영역으로 구성된다. Minor GC의 순서는 다음과 같다.

    1. Minor GC가 발생하면 Eden과 Survivor 1영역에 있는 Alive된 개체를 Survivor 2영역으로 이동하고 Eden과 Survivor 1영역을 Clear 한다.
    2. 다음 Minor GC가 발생하면 Eden과 Survivor 2영역에 있는 Alive된 개체를 Survivor 1영역으로 이동하고 Eden과 Suvivir 2영역을 Clear 한다.
    3. A,B을 반복하다가 Survivor영역에 오래된 개체는 Old영역으로 이동시킨다.

Minor GC와 같은 방식을 Copy & Scavenge라고 한다. 이 방법은 매우 속도가 빠르면 작은 크기의 메모리를 Collecting하는데 매우 효과적이다. Minor GC는 자주 일어나기 때문에 이 알고리즘이 적합하다.

  1. Full GC : Old 영역의 Garbage Collection을 말한다.
Full GC에 사용되는 알고리즘은 Mark & Compact라는 알고리즘을 이용한다. 이 알고리즘은 전체 객체들의 reference을 쭉 따라가다가 reference가 연결되지 않는 객체를 Mark한다. 이 작업이 끝나면 사용되지 않는 객체를 모두 Mark가 되고, 이 Mark된 객체를 삭제한다. Full GC는 매우 속도가 느리며, Full GC가 일어나는 도중에는 순간적으로 자바어플리케이션이 멈춰 버리기 때문에, Full GC가 일어나는 정도와 Full GC에 소요되는 시간은 어플리케이션의 성능과 안정성에 큰 영향을 준다.


Java Stack Memory 변화
Test Code
package com.naver.blog.inter999.jvm;

public class JavaStackModel {

    private static int x=0;
   
    public static void main(String[] args) {
        // Step 1
        int a=1;
        int b=2;
        int c;
        // Step 2
        c = sum(a,b);
        // Step 4
        x = c;
        // Step 5
        System.out.println(x);
    }
   
    public static int sum(int a, int b) {
        // Step 3
        return (a+b);
    }
}

Step 1
  • Method Area 영역에 “JavaStackModel.class”의 Method, static 변수 저장
  • Java Stack에 main Method의 매개변수 args 생성

Step 2
  • main Method의 지역변수인 a, b, c 생성

Step 3
  • sum Method가 호출에 사용된 매개 변수 a, b가 Java Stack 영역에 생성

Step 4
  • sum Method 실행 완료 후 sum Method에 할당된 a, b 변수 제거
  • sum Method의 return 값을 변수 c에 할당.

Step 5
  • 변수 c의 값을 static 변수 x에 할당

Heap Memory 변화
Test Code
package com.naver.blog.inter999.jvm;

public class HeapModel {
    public static String userGroup;

    public static void main(String[] args) {
        //Step 1
        String name1 = "홍길동";
        String name2 = "일지매";
        //Step 2
        User u1 = new User(name1);
        User u2 = new User(name2);
        //Step 3
        userGroup = u1.getName()+","+u2.getName();
        //Step 4
    }
}

class User {
    private String name;
   
    public User(String name) {
        this.name = name;
    }
   
    public String getName() {
        return name;
    }
}

Step 1
  • Method Area에 HeapModel, User Class, Static 변수 userGroup이 저장된다.
  • Java Stack에 HeapModel.main Method의 매개 변수 args가 저장된다.

Step 2
  • HeapModel.main의 로컬변수 name1, name2 가 생성 된다.

Step 3
  • Heap에 User Class의 Instance인 u1, u2가 생성된다.
  • Java Stack에 Instance u1, u2의 변수가 생성된다.

Step 4
  • u1, u2의 getName Method의 return 값이 Static 변수 userGroup에 할당 된다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...