JVM

Leo·2023년 3월 30일
0

static 은 런타임시 메소드 영역에 저장된다고 알고 있었습니다.
멀티스레드를 공부 하던중 heap에 할당되는 항목에 static variables가 있어 혼란스러워서 찾아봤습니다.

지금까지 메소드 영역과 영구영역은 각각 다른게 존재하고, Java 8 이후 부터는 영구영역은 제거되고 MetaSapce로 대체되었다 정도로 알고 있었습니다.

하지만 찾아본 결과 자바 8버전을 기준으로 저장되는 위치가 다르다는걸 알았습니다.


-출처- https://openjdk.java.net/jeps/122

hotspot jvm에서 permanent영역은 제거되고 permenent에서 관리하던 class metadata, interned String, class static variable은 heap영역이나 native memory영역으로 옮겨졌다. 더 정확한 표현으로 class meta-data는 native memory로 interned String과 class static은 heap영역으로 할당된다.

결론

자바 8버전 이전에는 heap이 아닌 parmanet Generation영역에

자바 8부터는 heap에 static variables이 할당된다고 합니다.
또한 heap에 저장되기 때문에 참조되지 않는 static 레퍼런스인 경우에도 GC의 대상이 됩니다.

PermGen이 제거된 이유

영구 영역은 제한적 크기를 갖기 때문에 가장 큰 단점인 OOM error가 발생했고, 이로인해 JVM은 비용이 많이 드는 GC를 자주 수행해야 했기 때문입니다.

영구 영역의 크기를 조정할 수 있지만 어렵고, 자동으로 조정 가능하게 할 수 없는 문제를 해결하기 위해 Java 8 에서 PermGen 영역은 완전히 제거되고 MetaSpace라는 새로운 기능으로 대체 되었습니다.
MetaSpaece는 OS에 따라 자동으로 크기를 늘리는 기능이 있어 OOM error에 대해 상대적으로 안전하기 때문입니다.

0개의 댓글