대부분의 RAM의 절반은 OS가 사용한다.
나머지 반을 JVM이 관리를 해주게 되는데, 프로그램 내에 사용되지 않는 메모리(쓰레기)는 가비지 컬렉션 기능에의해 자동으로 회수된다.
static 은 사용하기전에도 메모리에 이미 존재하는 자료 ?
프로그램이 실행될 때 부터 종료될 때 까지 메모리에 남아있게 된다. 전역변수로 지정하고싶을 때 static 을 사용한다.
heap 은 잠깐 메모리에서 사용하고 사라지는 자료 ?
참조형 데이터 타입을 갖는 객체,배열 들은 Heap영역에 데이터가 저장된다. 이때 변수(객체변수, 참조변수)는 Stack영역의 공간에서 실제 데이터가 저장된 Heap영역의 참조값을 new 연산자를 통해 리턴받는다.
다시 말하면 실제 데이터를 갖고있는 Heap영역의 참조 값을 Stack영역의 객체가 갖고있다. (매핑 테이블 ? 이야기인듯)
이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.
출처 :
함수가 호출되면, 함수 내부를 stack이라고 하는데 함수 호출시점부터 함수가 종료될 때 까지 메모리가 유지된다.
.class파일을 실행하면 static부분을 메모리에 로드한다.
static공간에 있는 main()함수를 호출하고
이때 stack이 생성되는데 이 stack의 이름이 main이다.
main은 stack이 종료되면 프로그램도 종료된다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
String str = "안녕하세요";
자바에서 String은 기본자료형이 아니라 클래스이다. (파스칼표기법)
크기를 정할수없는 타입(String 에 어떤크기의 변수가 들어갈지 모른다) = 레퍼런스 타입 (참조한다)
안녕하세요 가 저장이된것이 아니라 안녕하세요의 '주소'가 저장되어있다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
int[] n = {1,2,3}
메모리에서 연속된 세 공간이 있는 자리를 찾아서 시작주소만 저장한다. (배열의 크기를 알고있기 때문에 끝주소가 자동으로 계산이 된다)