BackEnd/Java
Java :: Code vs Heap vs Stack
초록 (green)
2016. 10. 10. 16:42
* 응용 프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받고, JVM은 메모리를 용도에 따라 여러 영역으로 나누어서 관리한다.
1. 코드 (Code) 영역
컴파일된 .class 코드 영역 (=클래스 영역 / 코드 영역 / 메소드 영역 - 이라고도 불린다)
0과 1로 된 2진수(binary)
static 변수 / static 메소드 (= static 영역이라고도 불린다) : class가 실행되기 전에 미리 메모리가 확보됨
2. 스택 (Stack) 영역 ( <=> 큐 )
가장 늦게 들어온 것부터 처리함
(ex. 함수 / 메소드 => A a = new B(); 시 B() 생성자 메소드를 호출하는게 아닌 뒤늦게 만들어진 인스턴스 a를 호출하는 것)
main() 메소드가 가장 먼저 호출됨 (지역변수를 저장할 메모리가 필요하니까)
3. 힙 (Heap) 영역
객체 인스턴스 (new 키워드가 들어가는)는 무조건 heap에 만들어짐 (생성자 메소드)
호출되는 클래스 내의 메소드들도 저장됨
* 만들어지는 순서 : code > stack > heap
* 종료되는 순서 : heap > stack > code
4. 예제
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
31 |
package com.example.java;
//CallStackTest : method area
public class CallStackTest {
// str : stack(정적 메모리)
String str = "홍길동";
// main method : call stack(정적 메모리)
public static void main(String[] args) {
// main method에서 firstMethod() 메소드를 호출했기 때문에 먼저 호출됨
System.out.println("console> main method() 시작");
firstMethod();
System.out.println("console> main method() 끝");
}
// firstMethod() method : Heap(동적 메모리)
public static void firstMethod() {
System.out.println("console> firstMethod() 시작");
secondMethod();
System.out.println("console> firstMethod() 끝");
}
// secondMethod() method : Heap(동적 메모리)
public static void secondMethod() {
System.out.println("console> secondMethod()");
}
} |
cs |