이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
자바 응용프로그램이 시작되면, 자바 가상 머신(Java Virtual Machine, JVM)은 프로그램 수행에 필요한 메모리를 할당 받고, 이 메모리를 관리합니다. 이에 대해 알아보도록 하겠습니다.
JVM의 메모리 구조
public class test { int iv; // 인스턴스 변수 static int cv; // 클래스 변수 void method() { int lv; // 지역 변수 } }
메소드 영역 (Method area)
프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일 (.class) 파일을 읽어 클래스에 대한 정보를 저장합니다. Class Variable도 함께 저장하는데 그것은 Static Variable과 같습니다. 어디서든 공유해 쓸 수 있는 변수를 의미합니다.
호출 스택 (call stack)
메서드의 작업에 필요한 메모리 공간을 할당합니다. 메서드가 호출되면 스택에 호출된 메서드를 위한 메모리가 할당되고, 이 메모리는 메서드의 연산의 중간 결과, 지역변수, 매개변수 등을 저장하는데 사용합니다. 그리고 메서드의 작업을 마치면 메모리 공간을 반환합니다.
힙 영역 (heap)
클래스의 인스턴스와 배열이 저장되는 공간입니다. 프로그램 중 생성된 인스턴스는 모두 이곳에 저장됩니다. 인스턴스 변수도 생성됩니다.
class Student{ int age; //instance variable String name; //instance variable public Student() { this.age = 0; name = "Anonymous"; } public Student(int Age, String Name) { this.age = Age; setName(Name); } public void setName(String Name) { this.name = Name; } } public class Main{ public static void main(String[] args) { Student s; //local variable - reference s = new Student(23,"Jonh"); int noStudents = 1; //local variable } }
메인 함수에서 Student 객체를 생성하면, 생성자에서 Student 객체 내의 setName 메서드를 호출하는 간단한 예제입니다.
스택의 흐름은 위와 같습니다.
1. 메인 클래스가 생성되면서 지역 변수인 noStudents가 메소드 영역에 생성됩니다.
2. Main Class에서 Object를 생성하게 되면 스택 영역에는 Student 자기 자신을 참조하는 this와 int Age, String Name("John" 을 참조하는 변수)이 Push되고 Heap 영역에는 Student object, String object(new String("Jonh"))가 생성됩니다.
3. setName 메소드를 실행하게 되면 스택 영역에는 Student 자기 자신을 참조하는 this와 String Name이 Push되고, String object의 값을 Student의 name 변수에 넣습니다.
'Basic > Java' 카테고리의 다른 글
[JAVA] Garbage Collection의 기초 (4) | 2016.07.20 |
---|---|
[JAVA] 객체(Object)의 형 변환 (2) | 2016.07.19 |
[JAVA] Static에 대하여 (0) | 2016.07.19 |
[JAVA] 자바의 변수 (클래스 변수, 인스턴스 변수, 지역 변수) (6) | 2016.07.19 |
[JAVA] 절차지향언어와 객체지향언어 (0) | 2016.07.19 |
[자바] 예외처리 (2) - 예외클래스의 구조 (1) | 2016.07.08 |