아래 포스팅은 HotSpot JVM을 기준으로 설명합니다.
JVM architecture(오라클 GC설명페이지)
Java 7에서 있던 -XX:MaxPermSize=size, -XX:PermSize=size option들은 이제 Java 8에서는 Deprecated되었다. 더 정확히는 metaSpaceSize로 대체(superseded)되었다고 볼 수 있다. 그래서 많은 개발자들이 java7에서 8으로 업그레이드 한 이후에 아래와 같은 warning 메시지를 본적이 있을 것이다.
Java HotSpot(TM) Server VM warning: ignoring option PermSize=32m; support was removed in 8.0 Java HotSpot(TM) Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
Perm영역은 Class의 Meta 정보, Method의 Meta 정보, Static변수와 상수 정보 저장되는 공간. 흔히 메타데이터 저장 영역이라고 한다.
이 영역은 Java 8 부터는 Native memory 영역으로 이동하여 Metaspace영역으로 명명되었으며, 다만 static object는 Heap영역으로 옮겨져서 GC의 대상이 최대한 될 수 있도록 하였다.
Java 7 HotSpot JVM 구조
Java 8 HotSpot JVM 구조
상기 Java 8의 memory 구조를 보면 알 수 있듯이 Metaspace가 Native Memory를 이용함으로서 java application이 필요한 만큼 계속해서 늘어나는 특징이 있다.
이는 java metaspace 초기치, 기대치 확인을 통해 정확히 알 수 있다.
$ java -XX:+PrintFlagsFinal -version -server | grep MetaspaceSize uintx InitialBootClassLoaderMetaspaceSize = 4194304 {product} uintx MaxMetaspaceSize = 18446744073709547520 {product} uintx MetaspaceSize = 21807104 {pd product} java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
상기 옵션을 통해 알 수 있듯이, Java 8의 MaxMetaspaceSize는 18,446,744,073,709,547,520Byte(약 16ExaByte, 64bit 프로세서 최고 메모리 상한치)라는 것을 알 수 있다.
그러므로, Java 8의 -XX:MaxMetaspaceSize를 두지 않는 이상, Native memory 자원을 최대한 사용한다.
※ Default jvm MaxMetaspaceSize = None
결국 Metaspace는 필요에 따라 자동적으로 증가하기 때문에 일반적으로 크게 주의를 가지고 설정할 필요는 없을 것으로 보인다.
'Programming Language > Java & Scala' 카테고리의 다른 글
Java8이상에서 MaxMetaspaceSize 설정, 반드시 해야할까? (262) | 2019.04.30 |
---|---|
scala개발시 sbt build때 GZIPInputStream: java.util.zip.ZipException: Not in GZIP format 에러나는 경우 해결책 (255) | 2019.02.21 |
자바 가비지 컬렉션 설명 및 종류 (395) | 2019.02.01 |
Java 시큐어 코딩 - 공격 종류 및 해결방안 (276) | 2018.11.23 |
Java 시큐어 코딩 - 개론 및 보안사례 (239) | 2018.11.22 |
예제로 알아보는 스칼라에서 Option monad (695) | 2018.10.31 |