본 포스팅은 java 8 버전 (openjdk 1.8)을 기준으로 작성한다.

 

이전 포스팅에 이어, 이번 포스팅에서는 Java HotSpot Virtual Machine 의 런타임 동작을 컨트롤 하는 옵션인 

Advanced Runtime Options에 대해 알아보도록 하자!

들어가기에 앞서, JVM 실행 옵션 중 Advanced 옵션들은 모두 'XX'가 붙는다는 것을 알아두자!


-XX:+CheckEndorsedAndExtDirs

: Java 애플리케이션이 *Endorsed-Standards Override Mechanism 또는 **Extension Mechanism을 사용하는 경우, java 커맨드가 실행되지 않도록 예방할 수 있는 옵션.  이 옵션은 아래와 같은 확인 과정을 거쳐 java 애플리케이션이 위와 같은 메커니즘을 사용하는지 판단한다.

 

  • java.ext.dirs 또는 java.endorsed.dirs 시스템 속성의 설정 여부
  • lib/endorsed 디렉토리 존재 여부
  • lib/ext 디렉토리에 JDK 이외의 다른 JAR 파일 존재 여부
  • system-wide platform-specific extension 디렉토리에 JAR 파일 존재 여부

 

*Endorsed-Standards Override Mechanism : JDK는 CORBA, DOM, SAX와 같은 패키지를 Java Endorsed Standards 로 분류하고 런타임에 포함시켜 놓았는데, 이러한 Endorsed-Standards 라이브러리들을 지정된 버전 또는 다른 구현체(implementation)로 바꾸고 싶을때 override 하는 것을 의미한다.

 

**Extension Mechanism : Java 플랫폼에서 실행되는 모든 어플리케이션 상에서 cumstom API를 사용할 수 있도록 하는 표준적, 확장 가능한 방법을 제공하는 메커니즘을 의미한다. 

 

-XX:+DisableAttachMechanism

: jcmd, jstack, jmpa jinfo와 같은 Tool들을 JVM에 연결하는 것을 disable 하는 옵션. Default는 해당 옵션이 꺼져 있어(-XX:-DisableAttachMechanism), 이와 같은 Tool들을 모두 JVM에 연결시킬 수 있다.

 

-XX:ErrorFile=filename

: 복구할 수 없는 Error 가 발생했을 때, 해당 에러 데이터를 어떤 위치의 어떤 파일로 쓸지 정하는 옵션. 디폴트로는, 현재 작업 디렉토리(JVM이 실행되는 현재 디렉토리)에 hs_err_pid%p.log 라는 파일명으로 생성된다.

 

 /var/log/java/java_error.log 라는 디렉토리로 해당 에러 파일을 생성하고자 한다면 아래와 같이 설정하면 된다.

+XX:ErrorFile=/var/log/java/java_error.log

 

-XX:+FailOverToOldVerifier

: 새로운 type checker가 fail 났을 때, 이전 verifier로 자동으로 Fail Over 할 수 있도록 하는 옵션. 디폴트로는, disable 되어 있다.

 

-XX:+FlightRecorder

: 애플리케이션 런타임 동안 JFR(Java Flight Recorder) 를 사용할 수 있도록 하는 옵션. 이 옵션은 commercial 기능이므로, 아래와 같이 '-XX:+UnlockCommercialFeatures' 옵션과 함께 사용해야 한다.

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

 

-XX:FlightRecorderOptions=parameter=value

: JFR의 동작을 제어하도록 하는 파라미터를 넣어 사용하는 옵션. 

 이 옵션은 아래처럼 사용하면 된다.

-XX:FlightRecorderOptions=defaultrecording=true,disk=true,maxchunksize=10M

 

아래는 사용 'parameter'의 값으로 사용 가능한 것들이다.

  • defaultrecording={true|false}
    : Java 애플리케이션에 작동하자마자 자동으로 레코딩을 시작할지 지정하는 파라미터. 디폴트로는 false이다.  
  • disk={true|false}
    : 디스크에 임시 데이터를 저장할 것인지 정하는 파라미터. 디폴트로는 false이다.
  • dumponexit={true|false}
    : JVM에 정상적으로 종료됐을 시, 덤프 파일 또는 JFR 데이터를 생성할 것인지 지정하는 파라미터. 디폴트로는 false이다. 이 파라미터를 사용하려면, defaultrecording 파라미터도 true로 설정하여야 한다. 또한 덤프 파일이 저장되는 경로는 아래에서 설명할 파라미터인 'dumponexitpath=path' 를 통해 지정한다.
  • dumponexitpath=path
    : path로 지정한 곳에 JFR에 대한 덤프파일이 저장되는 파라미터. 만약 해당 경로에 이미 덤프파일이 존재한다면, 파일명 뒤에 날짜와 타임스탬프를 추가하여 새 덤프파일을 생성하게 된다.
  • globalbuffersize=size
    : data retention 에 사용될 primary memory의 총 공간을 지정하는 파라미터. 단위는 바이트이며, 디폴트로는 462848 바이트로 지정되어 있다.
  • loglevel={quiet|error|warning|info|debug|trace}
    : JFR에 의해 쓰여질 로그파일에 대한 로그레벨을 지정하는 파라미터. 디폴트로는 info 이다.
  • maxage=time
    : 디폴트 레코딩으로 보존될 데이터의 최대 시간을 지정하는 파라미터. 디폴트로는 15m(minutes) 이다. 이는 'disk=true' 파라미터가 지정되어 있어야 설정 가능하다.
  • maxchunksize=size
    : 레코딩 할 때의 최대 데이터 청크 사이즈를 지정하는 파라미터.  디폴트로는 12MB 로 되어 있다. 이 파라미터 역시, 'disk=true' 파라미터가 지정되어 있어야 설정 가능한 파라미터이다. 
  • maxsize=size
    : 레코딩 할 때의 최대 데이터 사이즈를 지정하는 파라미터. 디폴트로는 최대 사이즈가 지정 되어 있지 않는데, 이 때 값이 0이다. 이 파라미터 역시, 'disk=true' 파라미터가 지정되어 있어야 설정 가능한 파라미터이다. 
  • repository=path
    : 임시 디스크 스토리지를 지정하는 파라미터. 디폴트로는 시스템 임시 디렉토리가 지정되어 있다.
  • samplethreads={true|false}
    : 스레드 샘플링을 사용할 지 정하는 파라미터. 디폴트로는 true로 되어 있다.
  • settings=path
    : 이벤트 설정 파일(JFC 타입)의 경로 및 이름을 지정하는 파라미터. 디폴트로는 'default.jfs' 로 되어 있는데, 이는 $JAVA_HOME/jre/lib/jfr 을 의미한다.
  • stackdepth=depth
    : JFR에 의해 추적할 스택 깊이를 지정하는 파라미터. 디폴트로는 64이며, 지정할 수 있는 최댓값은 2048, 최솟값은 1이다.
  • threadbuffersize=size
    : 스레드당 로컬 버퍼 사이즈를 지정하는 파라미터. 높은 값을 가질 수록, global 스토리지로 플러쉬없이 데이터를 버퍼에 갖고 있을 수 있다. 디폴트로는 5 KB 로 되어 있다.

 

-XX:LargePageSizeInBytes=size

: Solaris 환경에서 Java 힙에 사용될 페이지의 최대 사이즈를 지정하는 옵션. 이때 size 값은 2의 배수가 되어야 하며, 아래와 같이 사용한다.

-XX:LargePageSizeInBytes=4m

 

-XX:MaxDirectMemorySize=size

: New I/O(java.nio 패키지에 해당하는 부분)에 대한 direct-buffer 할당 최대 사이즈를 지정하는 옵션.

 

-XX:NativeMemoryTracking=mode

: JVM의 네이티브 메모리 사용에 대한 추적을 지정하는 옵션. 'mode' 에 들어갈 argument는 아래와 같다.

  • off : JVM 네이티브 메모리 사용에 대한 추적을 하지 않는 argument
  • summary : Java 힙, 클래스, 코드, 스레드와 같은 JVM 서브시스템의 메모리 사용량만 추적하는 argument
  • detail : summary에 더해, 각각의 CallSite, 가상 메모리 영역, commited 영역의 메모리 사용량까지 추적하는 argument

 

-XX:ObjectAlignmentInBytes=alignment

: 자바 객체에 대한 메모리 배정을 지정하는 옵션. 디폴트로는 8바이트로 지정되어 있다. 'alignment' 에 바이트 단위의 값이 들어가며, 이 값은 8 ~ 256 범위의 2의 배수여야 한다.

 

-XX:OnError=string

: 복구할 수 없는 에러가 나왔을 때, 큰 따옴표 안에 ';'(세미 콜론)을 구분자로 지정한 명령어를 수행하도록 하는 옵션.

아래와 같이 사용한다.

-XX:OnError="gcore %p;dbx - %p"

 

-XX:OnOutOfMemoryError=string

: Out Of MemoryError Exception이 처음 발생할 때 실행할, 사용자 지정 명령 또는 일련의 ';'(세미콜론)으로 구분된 명령을 설정하는 옵션. string에 들어갈 문자열 형식은 -XX:OnError의 string 형식과 동일하다.

 

-XX:+PerfDataSaveToFile

: Java 애플리케이션이 종료될 때, jstat(1) 바이너리 데이터를 저장하는 옵션. 이 바이너리 데이터는 hsperfdata_<pid> 라는 파일에 저장되며,다음과 같이 jstat 명령어를 사용함으로써 해당 파일에 있는 performance 데이터를 표시할 수 있다. 

jstat -class file:///<path>/hsperfdata_<pid>
jstat -gc file:///<path>/hsperfdata_<pid>

 

-XX:-PreferContainerQuotaForCPUCount

: 이 옵션이 enable 되어 있을 경우, CPU CFS(Completely Fair Scheduler) 할당량 값을 기준으로 컨테이너 CPU 가용성을 계산한다. 만일 -XX:ActiveProcessorCount 옵션을 이 옵션 사용할 때에 명시하지 않았다면, JVM은 사용가능한 프로세서 수 계산을 위해 컨테이너 CPU 가용성을 사용한다.

 

-XX:+PrintCommandLineFlags

: 명령줄에 나타난 인체공학적(?)으로 선택된 JVM 플래그들을 출력할 수 있게 해주는 옵션.

힙 공간 사이즈선택된 garbage collector 와 같은, JVM에 의해 인체공학적(?)으로 선택된 이 값들을 아는 것이 유용할 수 있다. 디폴트로 이 옵션은 Disable 되어 있다.

 

-XX:+PrintContainerInfo

: 다음 항목들과 같은 컨테이너에 대한 정보를 출력하는 옵션.

  • cpuset.cpus : 둘 이상의 CPU 또는 코어가 있는 경우, 컨테이너에서 사용할 수 있는 CPU 또는 코어의 범위. ','(쉼표) 또는 '-'(하이픈)으로 구분되어 있음. 예를 들어, 값 '0-3' 이 의미하는 바는, 컨테이너가 첫번째, 두번째, 세번째, 네번째 CPU를 사용할 수 있음을 의미함.
  • cpuset.mems : NUMA(Non-Uniform Memory Access) 시스템 상에서만 효과적으로 애플리케이션을 실행하도록 허용하는 메모리 노드의 범위.  ','(쉼표) 또는 '-'(하이픈)으로 구분되어 있음.
  • CPU Shares : 프로세스에 사용할 수 있는 CPU 공유량. 
  • CPU Quota : 프로세스가 실행되는 것이 보장되는 기간 대비 밀리세컨드(milliseconds).
  • CPU Period : CFS 주기. ms 단위.
  • OSContainer::active_processor_count : JVM에 사용할 액티브 프로세서 수
  • Memoery Limit : 컨테이너가 사용할 수 있는 메모리 최대 사이즈. 바이트 단위.
  • Memory Soft Limit : Memory Limit 보다 작은 값으로, 컨테이너가 초과할 수도 있는 메모리 최대 사이즈. 바이트 단위.
  • Memory Usage : 이 프로세스에서 사용되고 있는 메모리 량. 바이트 단위.
  • Maximum Memory Usage : 이 프로세스에서 사용할 수 있는 메모리 최대 사이즈. 바이트 단위.

 

-XX:+PrintNMTStatistics

: Native Memory Tracking 이 가능하다면, JVM 종료시, 해당 데이터를 출력하는 옵션. 디폴트로 이 옵션은 Disable 되어 있다. 

 

-XX:+RelaxAccessControlCheck

: 검증자(Verifier)의 Access Control 체크량을 줄이는 옵션. 디폴트로 이 옵션은 Disable 되어 있으며, 최신 바이트코드 버전이라면 무시될 수 있는 옵션이다. 

 

-XX:+ResourceManagement

: 애플리케이션의 런타임동안 Resource Management를 사용할 수 있도록 하는 옵션. 이 옵션은 아래와 같이
'-XX:+UnlockCommercialFeatures' 옵션과 함께 사용해야 하는 상용 옵션이다.

java -XX:+UnlockCommercialFeatrures -XX:+ResourceManagement

 

-XX:ResourceManagementSampleInterval=value (milliseconds)

: Resource Management 측정에 대한 샘플링 간격 값을 지정하는 옵션. ms 단위이다.
이 옵션은 '-XX:+ResourceManagement' 옵션이 활성화 되어 있는 경우에만 사용 가능하다.

 

-XX:SharedArchiveFile=path

: path에 CDS(Class Data Sharing) 아카이브 파일의 디렉토리를 명시한다.

 

-XX:SharedClassListFile=file_name

: CDS(Class Data Sharing) 아카이브에 저장할 클래스 파일의 이름이 들어 있는 텍스트 파일을 지정한다. 이 파일에는 '/'(슬래시), '.'(마침표)를 제외한, 한 줄당 하나의 클래스 파일의 full-name이 포함된다. 예를 들어, java.lang.Object 와 hello.Main 두 클래스들을 지정한다고 하면, 다음과 같이 텍스트 파일을 작성한다.

java/lang/Object
hello/Main

이 텍스트 파일에서 지정하는 클래스 파일들은 애플리케이션에서 일반적으로 사용하는 클래스 파일들이 포함되어야 하며, 여기에는 애플리케이션, extension 또는 부트스트랩 클래스 경로가 포함될 수 있다.

 

-XX:+ShowMessageBoxOnError

: JVM에서 복구할 수 없는 에러가 발생할 경우, 다이얼로그 상자를 표시하도록 하는 옵션.

이 옵션을 Enable 하면, JVM이 종료되지 않은 상태로, 디버거를 연결하여 오류의 원인을 조사할 수 있다. 디폴트로 이 옵션은 Disable 되어 있다.

 

-XX:StartFlightRecording=parameter=value

: Java 애플리케이션에 대한 JFR 레코딩을 시작하는 옵션.

'-XX:+UnlockCommercialFeatures' 옵션과 함께 사용해야 하는 상용 옵션이다. 또한 이 옵션은 런타임 중에 레코딩을 시작하는 JFR.start 진단 명령과 동일하다. JFR 레코딩을 시작할 때, 다음과 같은 parameter 들을 지정할 수 있다.

  • compress={true|false} : gzip 파일 압축 유틸리티를 사용하여 디스크에서 JFR 레코딩 로그 파일을 압축할지 여부를 지정.
  • defaultrecording={true|false} : 레코딩이 연속적인 백그라운드 레코딩인지 아니면 제한된 시간동안만 동작하는 레코딩인지를 지정하는 parameter. 디폴트로는 false로 지정되어 있다. 연속적인 백그라운드 레코딩을 수행하려면, true로 지정해야 한다.
  • delay=time : Java 애플리케이션 시작 시간과 레코딩 시작 사이의 지연 시간을 지정하는 parameter. 디폴트로는 값이 0으로 지정되어 있다. 
  • dumponexit={true|false} : JVM이 적절한 방법으로 종료될 때, JFR 데이터의 덤프 파일을 생성해야 하는지에 대한 여부를 지정하는 parameter. 디폴트로는 false로 지정되어 있다. 덤프 파일은 'filename' 파라미터로 지정된 경로에 만들어진다.
  • duration=time : 레코딩의 기간을 지정. 디폴트로는 값이 0으로, 기간이 제한되어 있지 않음.
  • filename=path : JFR 레코딩 로그 파일의 경로를 지정하는 parameter.
  • name=identifier : JFR 레코딩에 대한 식별자를 지정. 디폴트로, Recording x 로 설정되어 있음.
  • maxage=time : 기본 레코딩에 대해서 디스크 내에 보관될 최대 기한을 지정하는 parameter. 디폴트로 15분으로 지정되어 있음.
  • maxsize=size : 기본 레코딩에 대해서 디스크 내에서 보관될 최대 크기를 지정하는 parameter. 바이트 단위이다. 디폴트로 0으로 지정되어 있어, 크기가 제한되어 있지 않다.
  • settings=path : 이벤트 설정 파일의 디렉토리를 지정하는 parameter. 디폴트로 $JAVA_HOME/jre/lib/jfr 에 있는 'default.jfc' 파일이 사용됨.

이 옵션은 여러 parameter들을 쉼표로 구분하여 아래와 같이 사용한다.

-XX:StartFlightRecording=filename=test.jfr,compress=true

 

-XX:ThreadStackSize=size

: 스레드 스택 크기를 설정하는 옵션. 기본값은 플랫폼에 따라 아래와 같이 달라진다. '-Xss' 옵션과 동일하다.

  • Linux/ ARM(32비트) : 320 KB
  • Linux/ i386(32비트) : 320 KB
  • Linux/ x64(64비트) : 1024 KB
  • OS X(64비트) : 1024 KB
  • Oracle Solaris/ i386(32비트) : 320 KB
  • Oracle Solaris/ x64(64비트) :1024 KB

 

-XX:+TraceClassLoading

: 클래스가 로드될 때 Tracking을 활성화하는 옵션. 디폴트로 Disable 되어 있다.

 

-XX:+TraceClassLoadingPreorder

: 로드된 모든 클래스를 참조되는 순서대로 Tracking 하는 옵션. 디폴트로 Disable 되어 있다.

 

-XX:+TraceClassResolution

: *상수 풀(Constant Pool) resolution을 Tracking 하는 옵션. 디폴트로 Disable 되어 있다.

 

* Constant Pool Resolution : Resolution이란, Symbolic reference로 표현된 Entry를 찾아서 Direct Reference로 변경하는 과정을 말하는데, 클래스의 모든 Symbolic Reference는 메서드 영역의 Constant Pool이라는 곳에 저장되기 때문에, 이 Resolution을 Constant Pool Resolution이라 부른다. 즉, Constant Pool Resolution 정보란, Constant Pool의 포인터 정보를 일컫는다. 이 포인터 정보(주소)를 보고, Constant Pool(메모리에서의 PEM 영역)을 찾아가는 것이다.

 

-XX:+TraceClassUnloading

: 언로드되는 클래스들을 Tracking 하는 옵션. 디폴트로 Disable 되어 있다.

 

-XX:+TraceLoaderConstraints

: 로더 제약조건 레코딩을 Tracking 하는 옵션. 디폴트로 Disable 되어 있다.

 

-XX:+UnlockCommercialFeatures

: 상용 기능(Commercial Features)을 사용하도록 하는 옵션. 상용 기능들은 아래 링크에 Java SE Products 라고 정의되어  있는, Oracle Java SE Advanced 또는 Oracle Java SE Suite 패키지에 포함되어 있다. 디폴트로 Disable 되어 있으며, 이는 상용 기능(별도의 기능) 없이 JVM이 실행된다는 의미이다. 만일 해당 JVM 프로세스에 이 옵션이 Enable되도록 설정한 이후에는, 프로세스가 종료되지 않는 이상, 중간에 해당 옵션을 Disable 할 수 없다.

이 옵션을 사용하지 않아도, jcmd 진단 명령을 사용하여 가동 중인 JVM 상에서 상용 기능의 잠금을 해제할 수 있다.

http://www.oracle.com/technetwork/java/javase/terms/products/index.html

 

Java SE Products

Introducing Oracle Java SE Subscriptions The Java SE Advanced, Java SE Advanced Desktop, and Java SE Suite products have transitioned to a Java SE Subscriptions offering that provides more flexibility to customers. Customers who have Java SE Advanced, Java

www.oracle.com

 

-XX:+UseAltSigs

: JVM 내부 신호로 사용되는 SIGUSR1 및 SIGUSR2 에 대한 대체신호를 지정하는 옵션. 디폴트로 Disable 되어 있으며,

'-Xusealtsigs' 옵션과 동일하다.

 

-XX:+UseAppCDS

: 애플리케이션 클래스 데이터 공유(AppCDS) 기능을 Enable 하는 옵션. 이때 AppCDS를 사용하려면, CDS 덤프 타임 기간(-Xshare:dump 옵션) 및 애플리케이션 런타임 동안에 -XX:SharedClassListFile -XX:SharedArchiveFile을  지정해야 한다. 

 이는 상용기능으로서, -XX:+UnlockCommercialFeatures 옵션을 함께 사용해야 한다.

-XX:-UseBiasedLocking

: *Biased Lock 기능을 비활성화하는 옵션. 상당한 양의 제어되지 않은 synchronization 을 가지고 있는 애플리케이션의 경우, 이 옵션이 활성화(+)되어 있는 상태에서 상당한 속도 향상을 달성할 수 있는 반면, 특정 패턴의 lock 기능이 있는 애플리케이션은 속도가 느려질 수 있으므로, 비활성화(-)를 권장한다. 디폴트로 이 옵션은 Enabled 이다.

 

*Biased Lock : 일반적으로 쓰레드 간 경쟁을 피하기 위해, 개발 시에 Synchronized 키워드를 통해 쉽게 lock을 설정하는데, 그렇게 하면 일부는 여러 쓰레드 간 경쟁이 발생하기보다는 동일한 쓰레드에 대해서만 엑세스가 일어나는 경우가 자주 발생한다. 이런 경우, 모니터를 할당 받고 해제하는 과정이 성능상 비효율적일 수 있는데, Thread id 를 체크하여 lock을 획득하고자 하는 쓰레드가 반복해서 동일한 쓰레드라고 판단되면, OS lock을 사용하지 않도록 하는 lock을 말한다.

 

-XX:-UseCompressedOops

: **Compressed OOPS 사용을 Disable 하는 옵션. 디폴트로 이 옵션은 Enable 되어 있으며, Java 힙 크기가 32GB 미만일 때에 Compressed OOPS가 사용된다. 이 옵션이 Enable 되어 있으면, 개체 참조가 64비트 포인터 대신에 32비트 offset으로 표시되므로, 일반적으로 힙 크기가 32GB 미만인 환경에서 애플리케이션의 성능을 향상시킬 수 있다. 이 옵션은 64비트 JVM에 대해서만 동작한다.

 

*OOPS(Ordinary Object Pointers) : java는 포인터가 없는데, 이 말은 즉슨 모든게 포인터가 될 수 있다는 말이기도 하다. jvm은 오브젝트의 레퍼런스를 관리하기 위해 OOPS라고 불리는 자료구조를 가지는데, 32비트 시스템(ILP32)에서는 oops가 최대 힙의 4GB 까지 사용할 수 있다. 64비트 시스템(LP64)에서는 oops가 최대 힙의 18.5EB(엑사바이트) 까지 사용할 수 있다.

 

**Compressed OOPS : Java 에서는 OOPS가 차지하는 메모리의 양을 줄이기 위해 Tricky 한 방법을 사용한다. 

Compressed OOPS 를 통해 32비트 만으로도 32GB 힙을 사용할 수 있도록 하는 것인데, 기존에는 OOPS가 4GB 만큼의 메모리 영역을 직접 관리하였다. 그러나 Compressed OOPS 방식을 통해, OOPS 가 오브젝트를 레퍼런싱 하는 대신, 오브젝트의 offset 을 레퍼런싱하여, 3비트 만큼을 더 사용할 수 있으므로써, 64비트 방식이 아닐 때에도 2^32 (4GB) * 2^3  = 32 GB 만큼의 힙을 사용할 수 있도록 한다. 다만, 32GB 를 넘게 되면, 기존의 OOPS 방식을 사용하게 된다. (64비트 시스템)

 

-XX:-UseContainerSupport

: VM에서는 VM이 도커 컨테이너 안에서 실행 중인 Java 프로세스에 대해서 사용할 수 있는 메모리 양과 프로세스 수를 결정할 수 있는 자동 컨테이너 감지 기능(Automatic Container Detection)을 제공하는데, 이 정보를 사용하여 시스템 리소스를 할당하는 옵션이다. 이 옵션은 오직 Linux x64 플랫폼에서만 지원되며, 지원된다면 디폴트로 enable되어 있다.

 

-XX:+UseHugeTLBFS

: 리눅스의 경우, '-XX:+UseLargePages' 옵션을 사용하는 것과 동일한 효과이다. 디폴트로 disable 되어 있다. 이 옵션은 메모리가 점유되어 있는 경우, 모든 *Large Page를 미리 할당하도록 하는 옵션이다. 이렇게 되면, JVM은 Large Page 메모리 영역을 동적으로 늘리거나 축소할 수 없게 된다. 

 

*Large Page : 프로세서 TLB(Translation-Lookaside Buffers) 캐시에서 일부 작업을 제거할 수 있도록 하는 기술이다. 여기서 TLB 캐시란, 가상 메모리 주소를 물리적 메모리 주소로 변환하는 시간을 단축하는 데에 사용된다. 대부분의 아키텍처에서는 여러 Page 사이즈를 지원하며, 대부분 4KB를 기본값으로 가지는데, 메모리 점유가 매우 큰 애플리케이션의 경우, 메모리를 Large Page의 granularity(세분성)와 일치시켜주는 것이 TLB 캐시의 히트율을 높이는 방법으로 합리적이다.
 x86-64 에서는 이러한 목적으로 2MB 및 1GB의 페이지를 사용할 수 있으며, 메모리 사용량이 많은 워크로드의 경우, 이러한 Large Page 기능이 매우 큰 영향을 미칠 수 있다. 

 그러나 Large Pages 가 시스템 퍼포먼스에 부정적인 영향을 미치는 경우도 있다. 예를 들어, 애플리케이션에 의해 많은 양의 메모리가 예약되어 있는 경우, Large Pages 기능은 오히려 regular memory 부족을 초래하고, 다른 애플리케이션에서의 과도한 페이징을 유발하며 이는 전체 시스템을 느리게 만들 수 있다. 또한, 오랜 기간 가동되고 있는 시스템의 경우, 과도한 단편화가 진행되어 있을 것인데, 이는 충분한 Large Page를 할당하지 못하게 하기도 한다. 만약 이렇게 Large Page를 할당하지 못할 경우, OS 또는 JVM에서 regular page를 사용하도록 전환하게 된다. 

 

-XX:+UseLargePages

: Large Page 메모리를 사용 가능하도록 하는 옵션으로, 디폴트로는 disable 되어 있다.

 

-XX:+UseMembar

: 스레드 상태 전환 시 'Membar(*Memory Barrier)' 를 활성화 하는 옵션. 이 옵션은 ARM을 제외한 모든 플랫폼에서는 디폴트로 Disable 되어 있고, ARM 시스템에서는 디폴트로 Enable 되어 있다. (ARM 서버에서 Disable 시키는 것은 권장하지 않는다.)

 

*Memory Barrier : 메모리 베리어는 CPU나 컴파일러에게 barrier 명령문 전 후의 메모리 연산을 순서에 맞게 실행하도록 강제하는 기능을 말한다. 즉, barrier 이전에 나온 연산들이 barrier 이후에 나온 연산보다 먼저 실행이 되는게 보장되도록 하는 것이다. 

 

-XX:+UsePerfData

: 'perfdata' 기능을 활성화하는 옵션. JVM 모니터링 및 퍼포먼스 테스트를 허용하기 위해 디폴트로 Enable 되어 있다. 이 옵션을 비활성화 한다면, 'hsperfdata_userid' 디렉토리가 생성되지 않는다. 

 

* perfdata 또는 hsperfdata : Java 코드가 실행될 때, JVM에 의해 생성되는 로그 디렉토리로, 디폴트로 OS 에서 사용하고 있는 tmp 폴더에 생성되며, 파일 이름은 해당 JVM 프로세스의 PID로 된다. 

 

-XX:+UseTransparentHugePages

: 리눅스 환경에서 동적으로 증가 또는 축소가 가능한 Large Pages 기능을 활성화 하는 옵션. 이 옵션은 디폴트로 Disable 되어 있다. Large Page를 만들기 위해 OS가 다른 페이지를 이동할 때, transparent huge page 문제를 마주할 수 있는데, 이 옵션을 통해 해당 문제에 대해 테스트 해볼 수 있다.

 

-XX:+AllowUserSignalHandlers

: 애플리케이션에 의한 신호 핸들러를 설치할 수 있도록 하는 옵션. 디폴트로 이 옵션은 Disable 되어 있다. 


참고

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

 

java

Large Pages Also known as huge pages, large pages are memory pages that are significantly larger than the standard memory page size (which varies depending on the processor and operating system). Large pages optimize processor Translation-Lookaside Buffers

docs.oracle.com

https://fuirosun.tistory.com/entry/java-endorsed-override-mechanism

 

java endorsed override mechanism

JDK 8u25 버전을 쓰다가 JDK 업데이트를 하려고 Release Note를 봤다. 8u40릴리즈 노트에 "endorsed-standards override mechanism"가 deprecated API로 잡혀있었는데 처음 들어보는 용어라 찾아봤다. 공식 문서는..

fuirosun.tistory.com

https://xephysis.tistory.com/6

 

JVM Compressed OOPS

들어가는 말 몇 년 전 elasitcsearch 클러스터를 새로 구성했을 때 heap 관련 설정으로 찾았던 내용을 기록한다. 기본적으로는 ES 공식 가이드 (구버전)의 내용을 따라간다. 요약 jvm 기반의 애플리케이

xephysis.tistory.com

https://yoojin99.github.io/cs/Memory-Barrier/

 

Memory Barrier, 메모리 배리어란?

Memory Barrier가 무엇인지 알아보자.

yoojin99.github.io

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기