익히 알려진 것처럼 함수는 스택에서 실행된다.
이 말을 듣고 "그럼 static method도 마찬가지인가?" 하는 생각이 들었다.
static variables는 동적 영역이 아닌 정적 영역에 저장된다는 아래 그림(쉽게 배우는 자료구조 - 문병로 p.175)을 보고 의문이 들었기 때문이다.
결론부터 이야기하자면 "그렇다."이다. 어찌보면 당연한 얘기이긴 하다. static method여도 실행 자체는 당연히 스택에서 되기 마련이다.
일련의 자료들을 찾아보면서 왜 그런 의문이 들었는지 깨달았는데 그냥 단순한 JAVA 동작 원리에 대한 미숙한 이해때문이었다... 그래서 관련하여 정리를 하고자 한다.
------------------------
우선 JAVA 8 이후와 그 이전으로 나뉜다. JAVA 8 이후에는 Heap의 특정 영역인 PermGen이 사라지고(PermGen이 heap의 영역인지에 대해서도 어느정도 논란이 있는 듯 하다. 아니라고 보는 사람들도 많다.) MetaSpace로 대체되었기 때문이다.
다만 이 글에서는 동작 원리를 이해하고자 함이니 JAVA 8 이전 기준으로 설명하겠다. PermGen을 Metaspace로 바꿔 생각해도 무방하다.
-------------------------
헷갈렸던 이유 : method(혹은 클래스)의 메타 데이터가 저장되는 것과, 그 method가 실행되는 것의 메모리 공간을 혼동하였기 때문이다. 사실 static method 뿐만 아니라 method는 모두 heap의 PermGen에 저장된다. 여기서 말하는 것은 object의 정보가 아니라 class의 정보로써 말하는 것이다. 그리고 그것이 호출될 때 stack에서 실질적인 실행이 이루어 지는 것이다.
+a
static variable의 경우도 이 permGen 영역에 저장된다.
다만 primitives data들은 그 값이 permGem에 저장되지만 objects일 경우 그 reference 값 만이 permGen 영역에 저장되며 그 object 자체는 그 permGen이 아닌 normal section of heap에 저장된다.
쉽배자 책에서는 이 permGen 영역을 정적 영역으로 구별하고 있는 듯 하다. permGen 메모리의 경우 런타임 동안 메모리가 변경될 수 없다는 문제가 있었고 따라서 정적 영역으로 구별하는 것은 합리적인 것 같다. 다만 JAVA 7 이후에는 permGen은 metaSpace로 대체되었고 해당 메모리는 동적으로 늘어날 수 있다. 다만 다음 글인 String의 메모리 방식에서도 이야기하겠지만 permGen의 모든 기능을 metaSpace에서 대체하는 것은 아니다.
참고자료
'programming language > Java' 카테고리의 다른 글
Java - 상속과 다형성 깊게 이해하기 (binding) (2) | 2022.07.19 |
---|---|
Java - String 깊게 이해해보기 (2) | 2022.07.17 |