메모리는 크게 코드, 데이터, 스택, 힙으로 구별된다. 어떠한 변수인지에 따라 메모리 내에서 저장되는 위치가 다른데 먼저 변수의 종류부터 알아보도록 하자
선언 위치에 따른 변수의 종류
변수의 종류 | 선언 위치 | 생성 시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스가 생성되었을 때 | |
지역 변수, 매개 변수 | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
class Circle {
static int pi = 3.14; // 클래스 변수
int radius; // 인스턴스 변수
void method1() {
int localVariable; // 지역 변수
System.out.println("World!");
}
void method2(int arg) { // arg - 매개변수
System.out.println("World!");
}
}
main() - method1() - method2() 순서대로 실행시켰을 때 메모리 구조는 다음과 같다.
추가적으로 힙 메모리 영역에 대해 설명하자면 Garbage Collection (GC) 란 더 이상 사용하지 않는 메모리를 반환하는 것이다.
다음 코드를 살펴보자.
class Main {
public staic void main(String[] args) {
Circle c1 = new Circle();
Circle c2 = new Circle();
c1 = c2;
}
}
c1 과 c2 모두 힙 메모리에 저장된 인스턴스의 주소를 가진다.
c1 = c2 를 실행시키면 c1 에 c2의 메모리 주소가 저장되게 된다. 따라서 c1 주소를 통해 가리키던 c1 인스턴스는 의미 없어지며 쓰이지 않게 된다. 이를 JVM이 항상 관리하여 불필요한 메모리는 해제를 시킨다.
❗프로세스 메모리 구조와 커널 메모리 구조는 다르다
- 프로세스 : 코드, 데이터, 스택, 힙
- 커널 : 코드, 데이터, 스택
즉, 커널에는 힙 메모리가 존재하지 않는다.
그 이유는 커널은 메모리를 관리하는 인터페이스 그 자체이기 때문이다. 메모리를 관리하기 위해 쓰이는 인터페이스이기 때문에 커널 그 자체는 힙 메모리 영역이 없다.
(쉽게 생각하면, 유저 프로세스의 힙 메모리를 관리하는게 커널인데, 커널 자체의 힙 메모리는 누가 관리하는가? 없다!)
심화! 좀 더 어려운 코드로 살펴보기
public class Person {
int age;
String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void sayName(String prefix) {
System.out.println(prefix + name);
}
}
public class Main {
public static void main(String[] args) throws IOException {
int age = 12;
String name = "John";
Person person = new Person(age, name);
person.sayName("Hello ");
}
}
1. main() 메소드 실행
stack 에는 지역변수가 저장되며 age, name, person 변수가 해당된다. 원시 타입이라면 그 자체로 값을 저장하면 되지만 객체 타입이라면 heap 에서 참조되어한다. 따라서 객체 타입의 지역 변수에는 주소값이 저장된다.
2. sayName() 메소드 실행
인수 (지역변수) 가 주소값으로 저장되고 heap memory 에 "hello" 객체가 생성된다.
참고
'📗Java' 카테고리의 다른 글
[Java] 예시와 함께 알아보는 추상화 - 추상클래스와 인터페이스 (0) | 2023.07.20 |
---|---|
[Java] Chained Exception (0) | 2023.07.20 |
[Java] default 메소드는 왜 생겼는가? (0) | 2023.07.19 |
[Java] 생성자 super() 와 참조변수 super (0) | 2023.07.14 |
[Java] 생성자 this() 와 참조변수 this (0) | 2023.07.13 |