자바 키워드부터 다시 공부하고 있다.

static 사용의 장단점 및 주의사항을 알게되면서 JVM메모리에는 어떻게 저장될지 궁금해서 찾아보았다.

찾아볼수록 사람마다 다른 해석을 하고 Java8에서의 변화도 알게되면서 정리하는데 오랜 시간이 걸렸다.

(혹시 잘못 이해한 부분이 있다면 피드백 부탁드립니다.)

 

이해가 필요했던 부분들

  • static
  • JVM 의 method area
  • constant pool vs string constant pool
  • Permanent Generation의 변화 

 

Static 변수가 heap에서 관리되다 ?

static키워드를 통해 정의된 변수들은  method area내 constant pool에 reference 정보가 들어가고 value는 heap에 들어가 GC대상이 된다. 특히 String을 static으로 선언하면 heap안에 String constant pool안에 value가 저장된다. new키워드없이 바로 문자열을 대입하면 string constant pool영역에서 하나의 객체로 유지되는 것이다.

이는 new 키워드를 이용했을때와 다르다. static String을 new연산자를 이용하면 heap안에서 계속 새로운 객체로 인식이된다. 

 

method area를 heap의 일부로 정리되어있는 글도 있는데, 포인트는 Java8 부터 Static Oject 를 heap영역에 옮겨서 GC 대상이 될 수 있도록 한 것이다.

 

 

히스토리

이는 Permanent Generation이 MetaSpace으로 변한 히스토리 이해가 필요했다.

Class 데이터를 저장하는 곳은 method area이고 Java8이전에는 Method area를 PermGen에 할당했다. 이때 VM옵션으로 정해진 사이즈를 줬는데 이게 out of memory를 발생하게 했다. Java8 이후에는 PermGen 영역이 완전히 없어지고 Metaspace가 PermGen의 역할을 한다. permanent generation 에 저장된 정보도 GC대상이었다. 참조를 하지않는 Object를 GC대상이되록 하는데 변화가 있었던 것이다. 

 

 

정리

  • 지역변수가 primitive type 이면 stack에 저장된다.
  • 지역변수가 reference type 이면 객체는 heap에 저장되고 객체를 가리키는 reference는 stack에 저장된다.
  • 인스턴스 변수일 경우 primitive type 및 reference type 모두 객체는 heap에 저장되고 그 객체의 reference는 stack에 저장된다.
    클래스 변수가 primitive type이면 method area 내 runtime constant pool에 reference가 저장되고 value가 heap에 저장된다.
  • 클래스 변수가 reference type이면 heap내 객체자가 저장되고 reference를 method area내 runtime constant pool에 저장된다. 
  • String Literal 은 Heap내 String constant pool에 저장되어 동일한 주소를 유지한다.

 

참고 블로그

https://jgrammer.tistory.com/144

https://stackoverflow.com/questions/50163218/is-method-area-still-present-in-java-8

https://mirinae312.github.io/develop/2018/06/04/jvm_memory.html

https://8iggy.tistory.com/230

'* > What I did today' 카테고리의 다른 글

DB Connection Pool  (0) 2023.02.15
Tree  (0) 2023.01.10
null 대신 Optional 클래스  (0) 2023.01.02
GC  (0) 2023.01.01
JVM  (0) 2022.12.24
Java - static 사용의 지양  (0) 2022.12.17
Cache  (2) 2022.12.15
서버가 죽는 이유 ,message queue  (0) 2022.07.20

+ Recent posts