JVM에 대해 알아보던 도중, 상수가 저장되는 위치에 대해 의문점이 생겨서 알아보는 시간을 갖게 되었다.
String이 가지는 리터럴 값(문자열)이 Heap에 존재하는 공간인 String Pool에 저장된다는 것까진 알고 있었다.
그렇다면, 숫자나 다른 리터럴 값들은 어디에 저장되는 것일까?
정답은 Runtime Constant Pool
인 듯 하다.
Runtime Constant Pool
은 JVM
의 Runtime Data Area
에서 Heap
에 위치한다. 이는 JVM이 해당 class
에서 사용되는 모든 리터럴 값들을 저장한다.
Runtime Constant Pool
의 내부 구조를 살펴보면, 다양한 종류의 리터럴 값들이 존재한다.
여기서 우리가 다시 봐야할 부분은 JVM 8부터 Method Area
영역이 저장되는 Permanent Generation
이 Metaspace
으로 바꼈으며, JVM이 아니라 Native Memory(JVM이 아닌 실제 물리적인 메모리 공간)
으로 옮겨진 것을 볼 수 있다.
이전까지는 JVM에 할당된 메모리 크기만큼 리터럴 값을 사용할 수 있었지만, Java 8
부터는 Nativa Area
로 옮겨진 탓에 리터럴 값을 많이 선언하였다고 OutOfMemoryError
예외가 더 이상 발생하지 않는다.