즉, 애플리케이션이 메모리에 할당된 후에 CPU에 의해서 (애플리케이션)명령어가 실행된다.
그렇기에 애플리케이션을 실행하려면 우선적으로 애플리케이션이 메모리에 할당받아야 한다.
지비 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
JVM의 메모리 공간은 Method(static) 영역, Stack 영역, Heap 영역으로 구분된다.
컴퓨터의 메모리는 사용할 수 있는 공간이 한정되어 있기 떄문에 어떻게 관리하냐에 따라서 프로그램의 성능이 달라지기 때문
따라서 같은 기능의 프로그램이라 하더라고 메모리 관리에 따라 성능 차이가 난다.
그렇기에 Java 애플리케이션에서 메모리를 효율적으로 사용하기 위해서는 메모리 구조와 특징에 대해서 알아보자.
자바에서 선언 위치에 따른 변수의 종류를 알아보자
public class Main{
private static int gage = 100; //클래스 변수
public static void main(String[]args){ //매개변수
Counter c = new Counter();//지역변수
int count=c.get();
}
}
public class Counter{
private int state = 0;//인스턴스 변수
public void increament(){
state++;
}
public int get(){
return state;
}
}
변수명 | 선언위치 | 설명 | 생성시기 |
---|---|---|---|
클래스 변수(static 변수) | 클래스 영역 | 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 클래스 영역 | 개별적인 저장 공간으로 인스턴스마다 다른 값 저장 가능 | 인스턴스가 생성될 때 |
지역 변수 | 메서드 영역 | 메서드 내에서 선언되고 메서드 실행이 끝나면 소멸되는 변수로 초깃값을 지정한 후 사용할 수 있음 | 위치하고 있는 메서드가 수행될 떄 |
매개 변수 | 메서드 영역 | 메서드 호출 시 '전달하는 값'을 가지고 있는 인수로 선언된 곳부터 수행이 끝날 떄까지 유효하다 | 위치하고 있는 메서드가 수행될 때 |
예시를 들기 위해서 Heap, Stack 메모리 공간을 따로 두었지만 실제로는 한 메모리에 존재하고 두 영역이 메모리에서 차는 방향이 다르다.
public class Main {
public static void main(String[] args) {
int a = 7;
int b = 3;
int c = a + b;
}
}
public class Main {
public static void main(String[] args) {
int a = 100;
a= wow(a);
}
private static int wow(int num) {
int b = num*4;
return b;
}
}
public class Main {
public static void main(String[] args) {
int a = 100;
Counter counter = new Counter();
}
}
class Counter{
private int state=0;
public void increment(){
state++;
}
public int get(){
return state;
}
}
this 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있다.
public static void main(String[] args) {
Counter c = new Counter();
two(c);
int count = c.get();
}
public static void two(Counter c){
c.increment();
c.increment();
}
}
class Counter{
private int state=0;
public void increment(){
state++;
}
public int get(){
return state;
}
}
애플리케이션 자체가 종료되었으므로 heap 영역에 있는 Counter 객체도 삭제되는 것인가?
heap 영역에 있는 객체는 언제 삭제되는지 더 이상 참조되지 않은 객체이면 GC가 알아서 삭제하는 것으로 알고 있는데 프로그램 자체가 아예 끝나면 heap 영역에 있는 객체도 삭제가 되는 것인지
stack은 밑에서부터 차례대로 쌓이고, heap은 위에서부터 아래로 차례대로 쌓이는 게 맞는지 -> 지금은 heap 객체가 쌓이는 것을 stack처럼 아래서부터 그렸음
stack 밑에서부터 쌓이고, heap이 위에서부터 쌓인다면 그렇게 설계가 된 이유는 무엇인지?