Java의 method 실행 방식 - static

 

익히 알려진 것처럼 함수는 스택에서 실행된다.

 

이 말을 듣고 "그럼 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에서 대체하는 것은 아니다.

 

 

 

 

 

 

 

 

참고자료

https://stackoverflow.com/questions/8387989/where-are-static-methods-and-static-variables-stored-in-java

https://stackoverflow.com/questions/3849634/static-allocation-in-java-heap-stack-and-permanent-generation/3849819#3849819