JAVA2009. 11. 21. 14:09
 
본문스크랩 Java Memory Model Java

2009/01/20 18:05

작성자: 베레(lsj403)

출처 Hurukku's the pleasure | 후루꾸
원문 http://blog.naver.com/inter999/140053719800

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 변수 저장 영역

 

2.    Heap

-       프로그램 상에서 데이터를 저장하기 위해 동적(실행시간)으로 할당하여 사용하는 영역

-       “new”연산자로 생성된 객체와 배열을 저장

-       주로 실행시간에 생성되는 객체를 저장

-       GC(Garbage Collection)으로 관리 되는 영역

 

3.    Java Stack

-       Method 호출될 때마다 스택 프레임이 생성. 이것이 쌓여 스택을 구성.

-       수행되는 Method 정보, 로컬변수, 매개변수, 연산중 발생하는 임시데이터 저장.

-       JVM 스택영역을 실행중인 Thread 따라 각각 구성

 

4.    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 이동되기 전의 객체만 위치

 

2.    Old Generation

-        Survivor 1, Survivor 2 영역에서 이동해온 객체만 위치

-        Full GC 대상이 되는 객체가 위치

 

3.    Permanent Generation

-        JVM 클래스와 Method 객체를 위한 영역

1.    Minor GC : New(young)영역의 GC방법

Young 영역은 Eden 개의 Survivor 영역으로 구성된다. Minor GC 순서는 다음과 같다.

 

A.     Minor GC 발생하면 Eden Survivor 1영역에 있는 Alive 개체를 Survivor 2영역으로 이동하고 Eden Survivor 1영역을 Clear 한다.

B.     다음 Minor GC 발생하면 Eden Survivor 2영역에 있는 Alive 개체를 Survivor 1영역으로 이동하고 Eden Suvivir 2영역을 Clear 한다.

C.     A,B 반복하다가 Survivor영역에 오래된 개체는 Old영역으로 이동시킨다.

 

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

 

2.    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 할당 된다.

 


Posted by Tiwaz