자바 가상머신(jvm) 메모리 모델, 개념 이해하기
안녕하세요 ~!
이번 포스팅에서는
자바 가상머신(JVM)에 관련된 이야기를 해볼까 합니다.
사실 static에 대한 개념을 공부하던 중
jvm관련 개념을 알아야 할거같아 jvm부터 포스팅 하게 되었습니다.
사실 static에 대한 공부를 하고 포스팅 정리하는 중입니다
단지, jvm의 간략한 개념을 먼저 이해하는게 도움이 되서 먼저 포스팅 할 뿐!
먼저 의문점!
'메모리 관리는 운영체제가 하는 건가요?'
아니면
'가상머신이 하는 건가요?'
보통 이런 문제는 신경쓰지 않고 넘어가게 되는데
메로리 관리의 이해는 프로그래머에게 중요하다는 사실을 요즘들어 느끼고 있습니다.
메모리에 대한 답변
운영체제가 자바 가상머신에 메모리를 준다. ex) 4GB
자바 가상머신은 4GB를 본인이 알아서 사용한다.
그렇다면 자바 가상머신은 어떻게 메로리를 관리할까?
메소드영역 |
스택영역 |
힙영역 |
메모리 영역별 데이터
메소드 영역 : 메소드의 바이트 코드, static변수
스택 영역 : 지역변수, 매개변수
힙 영역 : 인스턴스
그렇다면 약간 생소한 단어가 있다 '자바 바이트코드(bytecode)'
자바 바이트코드(bytecode) : 소스파일을 컴파일 할 때 생성되는, 자바 가상머신에 의해 실행이 가능한 코드
이제 이러한 영역들이 어느 시점에 메모리에 올라가는지 정리해 보았다.
메모리 영역에 저장되는 시점
메소드 영역
클래스가 메모리에 올려지는 시점
즉, 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장 하기위한 메모리 공간
스택영역
지역변수, 매개변수는 메소드 내에서만 유효한 변수들이다.
즉, 프로그램의 실행과정에서 임시로 할당되었다가, 메소드를 빠져나가면 바로 소멸되는 특성의 데이터 저장 공간
힙 영역
인스턴스가 할당되는 공간,
어떠한 형태로검 참조되지 않는 인스턴스가 소멸의 대상이 된다.
인스턴스 소명의 기능을 '가비지 컬렉션(Garbage Collection)'이라 함
힙 영역에 대한 관리는 예시가 필요한 것 같다.
ex)
public static void test()
{
String str1 = new String("test1");
String str2 = new String("test2");
...
str1 = null;
str2 = null;
.....
}
str1은 스택영역에 올라와 있고 힙영역에는 "test1" 인스턴스가 올라와있다.
마찬가지로
str2도 스택영역에 올라와 있고 힙영역에는 "test2" 인스턴스가 올라와있다.
그러던 중!
str1과 str2는 사용되고 있다가 둘다 null값이 대입되고 있다.
이때 str1과 str2는 어떠한 참조변수도 참조하지 않는 상태에 놓이게 됩니다.
이 다음 포스팅은 static의 개념에 대해 알아보겠습니다.
감사합니다.