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

 

이전 포스팅에 이어, 이번 포스팅에서는 Java HotSpot Virtual Machine 에 특정한 범용 옵션인, Non-Standard Option 들에 대해 살펴보도록 하자! 들어가기에 앞서, Non-Standard Option 의 경우, 모든 옵션 앞에 'X'가 붙는다는 것을 알아두자!


Non-Standard Options

 

-X

: 사용 가능한 모든 -X 옵션(Non-Standard Option)에 대해 도움말을 출력한다.

 

-Xbatch

: JVM은 디폴트로 백그라운드 작업으로 컴파일하고, 백그라운드 컴파일이 끝날때까지 메소드를 인터프리터 모드에서 동작하게 되는데, 이 옵션을 사용하면 백그라운드 컴파일을 Disable 하게 된다. 이렇게 함으로써, 모든 메서드들은 동작이 완료될때까지 포그라운드(foreground) 방식으로 동작하게 된다.

 이는 Advanced JIT Compiler Option의 '-XX:-BackgroundCompilation' 과 같은 효과이다.

 

-Xbootclasspath:path

: 부트 클래스 파일을 검색할 디렉토리, JAR 파일, ZIP 아카이브를 ':'(colon, 콜론) 으로 구분하여 지정하는 옵션.

 이렇게 지정한 파일들은 jvm이 실행될 때 JDK에 포함된 부트 클래스 파일을 대신하여 실행되도록 한다. 단, 이 옵션을 사용하여 rt.jar 안에 있는 클래스를 재정의(Overriding) 하는 애플리케이션을 배포하여서는 안된다. 이는 JRE 바이너리 코드 라이센스에 위반된는 행위이다.

 

-Xbootclasspath/a:path

: 'Xbootclasspath:path' 옵션과 동일한데, 지정한 경로 앞에 'a'를 붙이므로써, 해당 경로는 디폴트 부트스트랩 클래스 경로의 하위 경로로 지정되어 부트 클래스 파일을 검색하는 옵션이다.

 

-Xbootclasspath/p:path

: 'Xbootclasspath:path' 옵션과 동일한데, 지정한 경로 앞에 'p'를 붙이므로써, 해당 경로는 디폴트 부트스트랩 클래스 경로의 상위 경로로 지정되어 부트 클래스 파일을 검색하는 옵션이다.

 

-Xcheck:jni

: *JNI(Java Native Interface) 기능에 대한 추가 검사를 수행하는 옵션. JNI 요청을 처리하기 전, JNI 함수와 런타임 환경 데이터에 전달된 매개 변수를 확인한다. 만약 잘못된 결과 데이터가 나온다면 이는 네이티브 코드에 문제가 있음을 나타내며, 이러한 경우 복구할 수 없는 에러와 함께 JVM을 종료하게 된다. 

 

*JNI(Java Native Inteface) : JVM 위에서 실행되고 있는 java 코드가 네이티브 응용 프로그램(하드웨어 및 OS 플랫폼에 종속된 프로그램 등), C, C++, 어셈블리 같은 java 와는 다른 언어로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능케 하는 프로그래밍 프레임워크를 말한다.

 이는 일부 하드웨어를 처리해야 하거나, 매우 까다로운 프로세스의 성능 향상을 요하거나, 타 언어로 작성된 기존의 라이브러리를 java로 재작성하려고 할 때 사용하는데, 이를 달성하기 위해 JDK에서는 JVM 에서 실행되는 바이트코드(.java 파일이 컴파일 된 .class파일)와 기본코드(.java 파일) 사이에 브릿지를 도입해야 하는데 이 브릿지 역할을 JNI가 하게 된다.

 

-Xcomp

: 첫 번째 메서드 호출 시, 강제로 컴파일하도록 하는 옵션이다. 원래 JVM에서는 디폴트로, 효율적인 컴파일을 위한 정보 수집을 위해 Client 버전의 경우 1,000개의 인터프리트된 메서드 호출, Server 버전의 경우 10,000개의 인터프리트된 메서드 호출을 수행하는데, 이 옵션을 사용하게 되면 인터프리트된 메서드 호출을 Disable하여, 전체 컴파일의 효율성을 포기하고 컴파일 자체의 퍼포먼스를 높이기 위해 사용된다.

 

-Xdiag

: 추가적인 진단 메시지를 출력하는 옵션.

 

-Xfuture

: 클래스 파일 형식 규격을 엄격하게 준수하도록 하는 'strict class-file check'를 Enable 하는 옵션. 미래 릴리즈(?)에서는 strict check가 디폴트로 될 것이므로, 개발자에게는 새로운 코드를 개발할 때 이 옵션을 사용하는 것이 권장된다.

 

-Xint

: 애플리케이션을 interpreted-only 모드로 작동시킨다. 이렇게 되면, 네이티브 코드로의 컴파일이 disable되며, 모든 바이트코드가 인터프리터에 의해 실행된다. 즉, JIT 컴파일러에 의한 성능 이점이 이 모드에서는 나타나지 않게 된다. 

 

-Xinternalversion

: -version 옵션보다 자세한 JVM 버전 정보를 출력한 후 jvm을 종료하는 옵션.

 

-Xloggc:filename

: 로깅을 위해 상세 GC 이벤트 정보를 리다이렉션할 파일을 설정하는 옵션. 이때 해당 파일에 기록된 정보는, 기록된 각 이벤트 전 첫번째 GC 이벤트 이후에 경과된 시간으로, -verbose:gc 의 출력 결과와 비슷하다. 따라서 동일한 java 명령어 내에서 -Xloggc 옵션과 -verbose:gc 옵션이 함께 쓰였다면, -Xloggc 옵션으로 재정의 된다. 

 

-Xmaxjitcodesize=size

: JIT-컴파일 코드에 대한 최대 캐시 사이즈(바이트 단위)를 지정하는 옵션. 디폴트 캐시 사이즈는 240 MB 이며, 만약 '-XX:TieredCompilation' 옵션을 사용하여 계층형 컴파일 옵션을 disable 했을 경우, 디폴트 캐시 사이즈는 48 MB 가 된다.

아래와 같이, 킬로바이트면 k/K, 메가바이트면 m/M, 기가바이트면 g/G를 숫자 뒤에 붙여 사용한다.

-Xmaxjitcodesize=240m

'-XX:ReservedCodeCacheSize' 옵션과 동일하게 사용된다.

 

-Xmixed

: 네이티브 코드로 컴파일 된 hot method를 제외한, 모든 바이트 코드를 인터프리터를 통해 실행하는 옵션.

 

-Xmnsize

: 힙 메모리의 nursery 영역의 최대 사이즈를 설정하는 옵션.

 

 JVM의 힙 영역은 물리적으로 두 부분으로 나눠지는데, nursery(young generation) 파트와 tenure(old generation) 파트이다. 

 여기서 nursery 파트는 새로운 객체를 할당하기 위해 힙에 확보된 공간으로, nursery 가 가득 차게 되면, young collction 또는 minor GC 라는 가비지 컬렉션이 수행된다. 이 과정 중, 살아있는 객체들만 체크하고 나머지는 다 없애버리게 되는데, 남아있는 객체들 중 어느정도 오래 머물렀던 객체들을 tenure 파트에 이동시켜 nursery의 공간을 다시 한번 확보하게 된다.

 

nursery 파트의 공간이 너무 작으면, 많은 minor GC 가 발생하게 될 것이고, 공간이 너무 크다면, 완료되는데에 오랜 시간이 걸리는 full GC 만 수행되게 될 것이다. 오라클에서는 전체 힙 사이즈의 25% ~ 50% 만 nursery 파트의 공간으로 잡을 것을 권장한다. 

 

nursery 파트의 최대 사이즈를 256 MB로 설정하는 옵션 예시는 아래와 같다.

-Xmn256m
-Xmn262144k
-Xmn268435456 		# 단위를 표시 안 하면 바이트 단위임.

 

-Xmssize

: 힙 메모리(nursery 파트 + tenure 파트)의 최소 및 초기 사이즈를 설정하는 옵션.

이 옵션이 지정되지 않았다면, nursery 파트에 대한 초기 힙 사이즈는 '-Xmn' 옵션 또는 '-XX:NewSize' 옵션을 통해 정해진 사이즈로 지정된다. 

 

사용 예시는 '-Xmn' 옵션과 동일하다.

 

-Xmxsize

: 힙 메모리(nursery 파트 + tenure 파트)의 최대 사이즈를 설정하는 옵션.

JVM Server 모드의 경우, -Xms 와 -Xms 가 동일하게 설정된다. 

 

사용 예시는 '-Xmn' 옵션과 동일하다.

 

-Xnoclassgc

: 클래스에 대한 GC(Garbage Collection)을 Disable 하는 옵션. GC 타임을 없애므로써, 애플리케이션 구동 간에 interruption 을 단축시킨다. 그러나 메모리 부족에 관한 Exception이 발생할 확률이 매우 높으므로, 주의하여 사용해야 한다.

 

-Xprof

: 실행 중인 프로그램을 프로파일링하고, 프로파일링 데이터를 표준 출력으로 보내는 옵션. 이 옵션은 프로그램 개발에 유용한 옵션으로, Production 시스템에서는 사용되지 않는다.

 

-Xrs

: JVM에 의한 OS 신호 사용을 줄이는 옵션. 예를 들면, 기본적으로 JVM은 OS가 종료 중이거나, 사용자 로그아웃 중임을 알리는 신호를 OS에서 포착하여 자체적으로 종료하는데, 이 동작으로 인해 사용자가 OS상에서 로그아웃 할 때 Application Server 서비스까지 종료되는 문제가 발생하게 된다. OS 사용자 로그아웃 여부와 관계없이 Java 애플리케이션이 종료되지 않고 실행되기 위해 해당 옵션을 사용한다. 

 

-Xshare:mode

: *CDS(Class Data Sharing) 모드를 설정하는 옵션. 가능한 'mode' 에 대한 매개변수로는 아래와 같다.

  • auto : CDS가 가능하다면 사용한다는 옵션. Java HotSpot 32비트 Client의 디폴트 옵션.
  • on : CDS를 사용해야 하는 옵션으로, CDS가 사용될 수 없다면 에러 메시지를 호출하고 JVM 종료.
  • off : CDS를 사용하지 않는 옵션. Java HotSpot 32비트 서버, 64비트 서버, 64비트 클라이언트의 디폴트 옵션.
  • dump : 수동으로 CDS 아카이브를 생성.

* CDS(Class Data Sharing) : JVM 기동 시 성능을 향상하기 위한 목적으로, JVM에서 공통으로 사용하는 클래스들을 공유저장소에 위치시키고 이를 각 JVM 들이 공유하여 사용하는 방식을 제공하는 모드. 

 

-XshowSettings:category

: 설정을 출력하고 JVM 실행을 계속 한다. 'category' 매개변수에 들어갈 수 있는 옵션으로는 다음과 같다.

  • all : 설정의 모든 카테고리를 출력. 디폴트 옵션이다.
  • locale : locale과 관련된 설정을 출력.
  • properties : 시스템 속성과 관련된 설정을 출력.
  • vm : JVM과 관련된 설정을 출력.

 

-Xsssize

: 스레드 스택 사이즈를 설정하는 옵션. 아래는 플랫폼별 스레드 스택 사이즈의 디폴트 값을 나타낸다.

  • 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

 

-Xusealtsigs

: JVM 인터널 신호에 대한 SIGUSR1, SIGUSR2를 대신하여 대체 신호를 사용하는 옵션.

 

-Xverify:mode

: 바이트코드 검증자 모드를 설정하는 옵션. 바이트코드 검증은 클래스 파일이 적절하게 형성되었는지, JVM 스펙에 따른 클래스 파일에 대한 제약사항을 잘 따랐는지를 검증한다. 가능한 'mode' 매개변수로는 아래와 같다.

  • remote : 부트스트랩 클래스 로더에 의해 로드되지 않는 모든 바이트 코드를 검증. 디폴트 옵션이다.
  • all : 모든 바이트코드를 검증.
  • none : 모든 바이트 코드에 대한 검증을 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://velog.io/@vrooming13/JNI-JAVA-Native-Interface

 

JNI (JAVA Native Interface)

📋 JNI란? 자바 네이티브 인터페이스는 자바 가상머신(JVM)위에서 실행되고 있는 자바코드가 네이티브 응용 프로그램(하드웨어와 운영 체제 플랫폼에 종속된 프로그램들) 그리고 C, C++ 그리고 어

velog.io

https://shinjekim.github.io/java/2020/01/06/%EC%9E%90%EB%B0%94%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0/

 

[Java] 자바의 메모리 구조 · Challengist

[Java] 자바의 메모리 구조 06 Jan 2020 | Java 자바의 메모리 구조 자바(JVM)의 메모리 영역은 heap, stack, static이 전부인것으로 알고있었다. 그런데 구글링을 해보니 블로그마다 설명하는 용어가 조금씩

shinjekim.github.io

https://johngrib.github.io/wiki/jvm-memory/

 

JVM 메모리 구조와 GC

작성중인 문서

johngrib.github.io

 

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