먼저 constant pool과 string pool에 관한 것을 chat gpt에게 물어봤다
Q : 자바에서 constant pool과 string pool은 다른거야?
A : 다르다. string pool은 constant pool의 한 부분이다 하면서 쏼라쏼라~
추가 질문
Q : constant pool은 jvm의 어느 메모리 영역에 저장돼?
A : method area에 저장된다(non-heap memory)
Q : 그러면 string pool도 method area에 저장되겠네 그치?
A : 맞다 string pool도 method area에 constant pool과 같이 저장된다
과연 그럴까..?
구글링해서 검색해보니까 Java에서 원래는 method area에 저장됐었는데 java 7부터는 heap 메모리에 저장되는 걸로 바꼈다고 한다 (string pool)
다시 chat gpt 에게 물어보자
Q : 자바 7부터는 string pool이 heap memory영역에 저장되는 거 아냐?
A : 잘못된 답변을 드려 죄송합니다. 자바7부터는 heap 영역에 저장됩니다 블라블라~
? 이새끼 그래도 사과는 잘하네
결론
string pool은 원래는 method area의 permanent generation에 저장됐는데 java 7 버전부터는 heap으로 옮겼다
예전 버전의 자바는 permanent generation의 크기가 고정돼있어서 heap으로 옮겼다고 한다
constant pool은 여전히 method area에 저장되는거고
그리고 chat gpt는 어떻게 질문하느냐에 따라 답변이 많이 달라지고 좀 불안정하다는 느낌을 많이 받음
챗지피티 검색해서 팩트체크를 한번더 해야됨..
실시간 레퍼런스 체킹해주는 익스텐션 깔면 안 저럼
질문자인데 챗지피티 답변은 오락가락 하기도하고 신빙성이 없어서 주로 서칭 위주로 찾아봤음. 나도 constant pool과 string pool(정확히는 intern string)으로 결론지었고. 문제는 static 변수였어. 얘도 heap 영역으로 자바8 넘어갈때 같이 이관되었다는데 많은 기본서도 그렇고 내가 알던 상식은 클래스변수는 - dc App
메서드 영역으로 알고 있었단 말이지. 여튼 이 부분은 hotspot jvm을 구현한 사람이나 그와 관련된걸 보지않는 이상 정확히 어떻다라고 말하기 힘들고 어느정도 받아드려야 한다고 하길래... 대충 - dc App
string pool과 runtime cosntant pool은 다르다. runtime constant pool은 메서드영역. string pool은 힙 영역. static 멤버도 heap 영역. 이정도로만 결론짓기로해썽 - dc App