PermGen(Permanent Heap)은 Java 8 버전 이하에서 존재했다. 클래스 메타데이터가 들어갈 곳인데 이 공간의 크기를 예측하기 어려웠다.
자바에서는 클래스의 메타데이터(class 메타정보, Method의 메타정보, static변수, 상수정보)를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있다.
PermGen 영역은 OS, JVM버전마다 각기 다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있어 java.lang.OutOfMemoryError
와 같은 에러를 접할 수 있다. PermSize를 commandline에서 늘릴 수 있으나 임시방편이다.
Java 8 버전에서는 PermGen 영역이 Metaspace로 대체되었다. Metaspace는 Native memory에 속하며 부족할 경우 자동으로 늘려준다.
MaxMetaspaceSize = None가 default 이므로 따로 설정하지 않으면 Native memory의 사용영역이 무한히 늘어나서 Memory swap이 일어날 수 있다. swap이 시작되면 application은 현저히 속도가 느려지니 장애상황과 다름없다고 볼 수 있다.
'language > java' 카테고리의 다른 글
[java] map과 flatMap의 차이 (0) | 2022.06.09 |
---|---|
Annotation 생성시 @Retention (0) | 2022.02.13 |
Resouce leak: 'applicationContext' is never closed (0) | 2022.01.27 |
oom 발생시 jvm dump 뜨기 (0) | 2021.10.21 |
VScode Junit에서 test용 application.yml 못읽어올 때 (0) | 2021.10.02 |