자바가 실행이되면 JVM은 메모리를 할당받고 그 메모리를 용도에 따라서 나누어 관리한다.
JVM의 메모리 공간이 어떻게 나누어지고 관리되는지 알아보고 차이점을 알아보자.
변수는 크게 네종류로 변수의 선언된 위치에 따라서 클래스변수, 인스턴스변수, 지역변수, 매개변수로 구분된다.
public class Main {
public static void main(String[] args) { // 매개변수
int num = 990; // 지역변수
}
}
public class Counter {
private int state = 0; // 인스턴스 변수
public static int gade = 100; // 클래스 변수
public int get() {
return state;
}
클래스변수 : 클래스가 메모리에 올라갈 때
인스턴스변수 : 인스턴스가 생성되었을 때
지역변수 / 매개변수 : 위치하고 있는 메서드가 수행되었을 때
아래의 예제로 이해 해보자.
public class Main {
public static void main(String[] args) {
int a = 100;
a = wow(a);
}
public static int wow(int num) {
int b = num * 4;
return b;
}
}
위 예제를 그림으로 그려보자.
public class Main {
public static void main(String[] args) {
int a = 100;
a = wow(a);
}
public static int wow(int num) {
int b = num * 4;
return b;
}
Stack 메모리는 변수들이 저장되고 메서드 함수가 호출될 때 마다 쌓이는 방식으로 동작한다.
아래의 예제로 이해 해보자.
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
two(c);
int count = c.get();
}
public static int two(Counter c) {
c.increment();
c.increment();
}
}
public class Counter {
private int state = 0;
public void increment() { state++; }
public int get() { return state; }
}
예제를 그림으로 그려보자.
가비지 컬렉터의 대상이 되는 객체는 무엇인지 확인해보자.
public class Main {
public static void main(String[] args) {
Counter c = make();
}
public static Counter make() {
Counter c = Counter();
return new Counter();
}
}
public class Counter {
private int state = 0;
public void increment() { state++; }
public int get() { return state; }
}
이것도 그림으로 그려보면서 이해 해보자.
출처: https://inpa.tistory.com/entry/JAVA-☕-그림으로-보는-자바-코드의-메모리-영역스택-힙#힙_과_스택_메모리의_차이점 [Inpa Dev 👨💻:티스토리]
출처 : https://www.youtube.com/watch?v=GIsr_r8XztQ [쉬운코드 - 변수와 객체와 메모리의 관계! 자바를 예로 들어 변수와 객체는 메모리에 어떻게 저장되는지 정말 쉽게 설명해요!]
stack과 heap에 대해서 개념 잘 세기고 갑니다!👍