자바의 메모리 모델
운영체제 관점에서 JVM도 하나의 프로그램이다. 운영체제 입장에서 자바 프로그램과 JVM 둘 다 메모리 공간을 할당해야 한다. 따라서, 자바 프로그램이 2개 실행되면, JVM도 2개 실행된다. 하나의 JVM은 하나의 자바 프로그램을 실행시킨다.
JVM은 메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 3개의 영역으로 구분한다.
메소드 영역
- 메소드 바이트 코드(.java -> .class), static 변수를 저장한다.
- 한번 저장(기록)하면 프로그램이 종료될 때까지 유지가 된다.
스택 영역
- 지역변수, 매개변수
- 이 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸된다.
힙 영역
- 인스턴스
힙과 스택을 구분하는 이유는?
한 인스턴스 X를 두 참조변수 x, y가 참조한다 가정해보자. x를 지웠다고 해서 인스턴스 X도 지워지면 어떤 문제가 발생할까? y는 존재하지만 x를 지우면서 X도 지웠으므로 y가 참조하는 인스턴스가 의도치 않게 없어진게 될 것이다. 이와 같은 이유로 스택과 힙을 구분해주는 것이다. 인스턴스가 아무에게도 참조되지 않았을 때 비로소 지워야 한다. 다행히도 JVM이 힙 영역을 스캔하면서 해당 인스턴스를 참조하는 변수가 있는지 확인하고, 아무도 참조하지 않았으면 인스턴스를 지운다. 이러한 액션을 가비지 컬렉션(garbage collection)이라 한다. 따라서, 힙 영역을 가비지 컬렉션 영역이이라고 한다.
인스턴스는 언제 소멸시킬까?
- 누구도 참조하지 않았을 때(가비지가 되었을 때)
- 가비지를 모아서 버리는 액션을 JVM이 해준다.
'Programming > Java' 카테고리의 다른 글
JAVA 19(3) equals 메소드 (0) | 2021.08.05 |
---|---|
JAVA 19(2) Object 클래스 (0) | 2021.08.05 |
JAVA 18(2) 예외 클래스 Throwable (0) | 2021.08.05 |
JAVA 18(1) 예외처리의 기본 (0) | 2021.08.05 |
JAVA 17(3) 인터페이스의 static 메소드 (0) | 2021.08.04 |