(+) 자바 코드 실행에 따른 메모리 적재과정
Last updated
Last updated
아직 4장까지 밖에 안봤지만 저자는 책의 전반에 걸쳐서 라인바이라인 단위 수준으로 JVM 메모리 내에서 어떤 식으로 적재가 되고 있는지를 계속 언급하고 있다. T 메모리 라는 용어를 사용하고 있는데 스태틱 영역, 스택 영역, 힙 영역을 보기 쉽게 만든 도식이다.
그래서 이 부분을 책의 샘플 코드를 통해서 따로 정리해봤다.
책에서는 ~3장 까지의 기준으로 java.lang, import 들이 모두 올라간다고 이야기 되어 있는데 4장에서 말이 바뀐다. import 들이 모두 올라가는 것은 맞으나 바로 올라가는 것이 아니라 해당 클래스가 사용될 때 그 시점에 적재된다는 것이다.
java.lang 과 현재 사용되는 class 를 static area(=메소드 영역)에 '바이트 코드' 상태로 적재한다. 메소드 영역에 적재되는 것은 java.lang, import 패키지이다. '클래스 로딩' 의 과정이라고 이해하자.
책에 따르면 제일 먼저 java.lang 이 적재 된다고 한다.
그 뒤 현재 사용될 클래스(import 에서 만나서 메소드 영역에 적재되는 것 같다) 가 적재된다.
2번 라인을 시작하며 스택 영역에 해당 함수의 스택이 생성된다. 하지만 여기서 주의해서 알 부분은 해당 스레드의 독립된 스택영역 내에서 main 의 스택이 생긴다는 것이다. 즉, 해당 코드를 실행시키는 스레드 자기 자신만의 고유 스택 영역 내에 저 main 스택이 생긴다는 것이다.
main() 실행 후 해당 스택은 없어진다.
static 에 적재된다. 위에서 정리했으니 생략.
main 실행되면서 스택에 main 스택 생성된다. 아무 스레드나 다 접근하는 스택의 영역이 아니고 모든 스레드가 하는 스택 영역 내에 해당 스레드 '고유의' 공간인 스택 내에 main 스택이 생성되는 것.
변수 i 를 선언했으나 아직은 값이 할당 되지 않은 상태
코드 4번 줄에서 i에 10이 할당되었다.
코드 6번 줄에서 d의 선언과 할당이 동시에 이뤄짐. 위 그림에서는 동그라미 5번 단계와 6번 단계가 코드의 6번 줄에서 동시에 이뤄진 것.
기본적인 단계는 생략했다.
if(true) 스택 프레임 생성된다. else 는 아예 스택이 생성되지 않는다.
7번줄 실행하면서 m을 할당한다
8번줄 실행하면서 k 에 새로운 값을 할당한다
if가 종료되면 if 스택 프레임이 없어진다.
4번줄 까지 실행된 모습이다.
인자로 선언된 k 가 5 라는 값이 할당된다.
square() 스택 내에 선언된 result 라는 변수가 생성된다. 그림이 좀 잘못되었는데 k 가 25로 바뀌는 부분이 실행되면서(=10번 줄이 실행되면서) 25로 재할당 된다.
11번 줄이 실행 되면서 result 에도 25가 할당된다.
12번 줄이 실행 되면서 반환값에 25가 할당된다.
13번 줄이 실행 되면서 square() 스택이 없어짐과 동시에 반환값에 있던 25가 m에 할당된다
square() 스택은 없어진다.
13번줄이 끝난 직후의 T 메모리이다.
핵심은 pingu 와 pororo가 가리키고 있는 객체의 타입이 다르다는 것이다. pororo는 Penguin 을 가리키고 있고 pingu 는 Animal 을 가리키고 있다. 그렇게 선언을 했기 때문이다.
상속 구조에서는 T 메모리가 위와 같은 형태임을 인지하자.
코드를 좀 바꿔본다.
책이 되게 혼란스럽게 해놨다. 위 그림들은 실제로 책에 실린 내용이지만 4장에서 사실 메모리 효율화를 위해서 힙에는 메소드가 생성되지 않는다고 써두었다.
왜냐하면 특정 클래스를 가지고 객체를 100개를 만들어도 해당 클래스가 가진 메소드는 100개 모두 똑같기 때문에 굳이 100개를 만들어줄 필요 없에 메소드 영역에 하나만 선언해놓고 참조만 하면 되기 때문이다.
상속이 이뤄진 경우도 마찬가지다. 즉, 위 그림의 힙의 그림에서 showName() 은 없어져야 맞는 그림이다. 위 메소드 영역과 같은 그림처럼 showName() 은 상위 객체, 하위 객체 모두의 메소드가 존재하게 되며 결국 pingu 랑 pororo 의 타입이 무엇으로 선언 되었는지에 따라 메소드 영역의 참조하는 메소드가 달라질 뿐이다.