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
- 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이라고도 하며 새로 생성된 객체들을 위해 사용됨.
2. Old Generation - Survivor 1, Survivor 2 영역에서 이동해온 객체만 위치 - Full GC의 대상이 되는 객체가 위치 3. Permanent Generation - JVM 클래스와 Method 객체를 위한 영역
Java Stack Memory 변화 Test Code
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
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에 할당 된다. |
'JAVA' 카테고리의 다른 글
Calendar, GregorianCalendar, dateFormat, SimpleDateFormat 을 이용한 시간 출력 (0) | 2009.11.24 |
---|---|
String, StringBuilder, StringTokenizer 클래스의 메소드 사용 예제 (0) | 2009.11.24 |
클레스간 상속 (객체 생성 타입 케스팅 예제) (0) | 2009.11.21 |
enum 열거 상수 (0) | 2009.11.21 |
실습5 패키지 컴파일 cmd창 (0) | 2009.11.21 |