본문 바로가기

Programming Language/Java & Scala

Java 8 에서 사라진 maxPermSize, PermSize을 대체하는 옵션?

아래 포스팅은 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는 필요에 따라 자동적으로 증가하기 때문에 일반적으로 크게 주의를 가지고 설정할 필요는 없을 것으로 보인다.