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

 

기본적으로 java 기반의 파일(.jar 파일, .class 파일 등)을 실행할 때 아래와 같은 명령어 형식을 사용하게 된다.

java [options] {classname} [args]
# ex) HelloWorld.class 파일을 실행
# java HelloWorld.class

java [options] -jar {filename} [args]
# -jar 옵션 : .class 가 아닌 .jar 파일을 실행할 때 사용.
# ex) HelloWorld.jar 파일을 실행
# java -jar HelloWorld.jar
  • [options] : 여러 옵션들이 입력 가능하고, 이때 공백으로 각 옵션들이 구분 되어진다.
  • [args] : Argument(매개변수)에 해당하고, 역시 여러 개가 올 수 있다. 이 부분에 입력된 매개변수들(공백으로 구분됨)은 모두 main() 함수에 넘겨진다.

[options] 에 들어가는 java 실행 옵션들에는 엄청나게 많은 옵션이 존재한다.

java 공식 문서에서는 다음과 같은 카테고리로 옵션들을 분류하였다.

  • Standard Options
    : 모든 JVM의 구현체에서 지원이 보장되는 java 표준 옵션을 말한다. JRE의 버전 체크, class path 지정, verbose output 여부 등과 같은 기본적인 기능을 지원한다.

  • Non-Standard Options
    : Java HotSpot Virtual Machine 에 특정한 범용 옵션으로, 모든 JVM 구현체에서 지원되지 않을 수 있으며, 구현체마다 변경될 수 있다. 이 옵션은 앞에 '-X' 를 붙여서 사용한다.

  • Advanced Runtime Options
  • Advanced JIT Compiler Options
  • Advanced Serviceability Options
  • Advanced Garbage Collection Options
    => Advanced 옵션Java HotSpot Virtual Machine 의 특정 영역을 조정하는 데에 사용되는 Developer 옵션으로, 특정 시스템 요구사항이 있거나 시스템 구성 매개변수에 대한 액세스 권한이 필요할 수 있으므로, 일반적인 용도로는 잘 사용하지 않는다. 이 역시 모든 JVM 구현체에서 지원되지 않을 수 있다. 앞에 '-XX' 를 붙여서 사용한다. 
     또한 부울 형식이 지원되어, 옵션을 활성화(-XX:+OptionName) 시키거나, 비활성화(-XX:-OptionName)가 가능하다.
     참고로, 최신 릴리스에서 더 이상 사용되지 않거나 제거된 옵션을 추적하길 원한다면, 아래 링크에서 찾아볼 수 있다.
    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDCEGG 

본 포스팅에서는 java 의 Standard Option 들만 다룬다.

Standard Options

 

-agentlib:libname[=options]

: 특정 native agent 라이브러리를 로드하기 위한 옵션. 

 

-agentlib:foo 의 형태로 옵션을 주게 되면, LD_LIBRARY_PATH(리눅스에서 환경 변수로 지정.) 안에서 libfoo.so 라는 이름으로 된 라이브러리를 로드하는 매커니즘이다. 

 

아래 예시는 HPROF(Heap Profiling Tool) 라이브러리를 통해 샘플 CPU 정보를 20분마다, 3이라는 스택 depth로 받는 옵션을 나타낸다.

-agentlib:hprof=cpu=samples,interval=20,depth=3

아래 예시는 JDWP(Java Debug Wire Protocol) 라이브러리를 로드하고, 8000 포트를 통해 JDWP를 이용하며, main class를 로드하기 전에 우선하여 로드하는 옵션을 나타낸다.

-agentlib:jdwp=transport=dt_socket,server=y,address=8000

-agentpath:pathname[=options]

: -agentlib 옵션과 동일한 기능으로, native agent 라이브러리를 로드하는 옵션이다. 다만 차이가 있다면, pathname에 반드시 절대 경로를 사용하여야 한다는 점이다.


-client / -server

: Java HotSpot VM 의 컴파일러 종류 client로 할 지, server로 할지 선택하는 옵션.

 

CPU 코어 개수가 하나뿐인 사용자를 위해 만들어진 것이 client 컴파일러이다. 

반면 server 컴파일러는 코어 수가 많은 장비에서 어플리케이션을 돌리기 위해 만들어졌으며, 수행 속도에 초점을 두고, 어플리케이션 시작 시간을 빠르게 하면서 적은 메모리를 점유하도록 세팅되어 있다.

 


-Dproperty=value

: *System Property 값을 설정하는 옵션.

 

value에 해당하는 값에 string 형태로 들어가는데, 공백을 넣으려면 큰 따옴표로 묶어줘야 한다.

ex) -Dfoo="foo  bar" 

=> foo 라는 System Property 에 "foo bar" 라는 string 값을 지정한다.

 

 

* System Property : 시스템 속성. 시스템 전역적으로 사용되는 값들을 담고 있음. System 클래스에 있는 getProperty() 메소드를 이용하여, 현재 사용하고 있는 System Property 값들을 확인할 수 있음. java.version, java.vendor.url, os.name, os.arch, path.separator 등이 System Property에 해당함.


-d32 / -d64

: 어플리케이션을 32비트 환경으로 구동할 것인지, 64비트 환경으로 구동할 것인지 선택하는 옵션.


-disableassertions[:[packagename]...|:classname]

-da[:[packagename]...|:classname]

: *Assertion(어설션)을 Disable 하는 옵션. 디폴트 설정으로 모든 패키지 및 클래스들에서 Assertion은 disable 되어 있다.

참고로, enable 하려면 -enableassertions 또는 -ea 옵션을 사용한다.

 

... 은 패키지 내의 어설션 disable 범위를 설정하는 개념으로 보면 된다.

 

ex) MyClass 라는 클래스에 대해서 com.wombat.fruitbat 패키지 내에서는 (서브 패키지 포함) 어설션을 enable 하고, 

com.fruitbat.Brickbat 패키지에서는 disable 하려고 한다면, 아래와 같이 사용하면 된다.

java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass

-disablesystemassertions

-dsa

: 모든 시스템 클래스들에 대하여 Assertion을 Disable 하는 옵션.


-javaagent:jarpath[=options]

: Java 프로그래밍 언어 기반의 에이전트(jar 파일)를 로드하는 옵션. 자세한 사항은 https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html 참조.

 

 JVM에서 동작하는 Java 어플리케이션을 통해, JVM의 다양한 이벤트를 전달받거나 정보 질의, 바이트코드 제어 등을 특정 API를 통하여 수행할 수 있게 하는 옵션이다.

 여기서 특징으로, Agent는 지정된 JVM의 실행 가능한 최초 진입점인 main 메서드를 가로챌 수 있다. 그리고 반드시 지정된 JVM에서 실행되어야 하며, 지정된 JVM의 동일한 System Class Loader 내에서 로드되며, 지정된 JVM의 Security Policy 및 Context의 영향을 받게 된다. 

 

에이전트의 단일 진입점은 아래의 premain 메서드를 구현하면 되고, 바이트 코드를 포함한 추가적인 정보 수집 도구로 화활용하고자 한다면, Instrumentation 인터페이스를 제공받을 수 있다.

public static void premain(String agentArgs, Instrumentation inst);
# 또는
public static void premain(String agentArgs);

-jre-restrict-search | -no-jre-restrict-search

: 버전 검색에서 사용자 전용 JRE를 포함 또는 제외할 수 있는 옵션.


 

-showversion

: 버전 정보를 표시하고 응용 프로그램의 실행을 계속 하는 옵션.

-version 옵션의 경우, 버전 정보를 표시하고 JVM을 종료하도록 지시하지만, 이 옵션은 jvm 실행을 지속함.


-splash:imgname

: 어플리케이션을 실행할 때, *스플래시 스크린을 지정한 이미지 파일 경로의 해당 이미지로서 보여주는 옵션.

 

* 스플래시 스크린 : 이미지, 로고 및 소프트웨어의 현재 버전을 포함하는 창으로 구성된 시작 화면을 말한다.


-verbose:class

: 로딩 되어지는 클래스에 대한 정보를 출력하는 옵션.


-verbose:gc

: GC(Garbage Collection) 이벤트에 대한 정보를 출력하는 옵션.


-verbose:jni

: native 함수 및 다른 JNI(Java Native Interface) 사용에 대한 정보를 출력하는 옵션.


-version:release

: 애플리케이션 실행에 사용할 JRE 의 버전을 지정하는 옵션. 이때 호출된 java 명령어의 버전이 지정한 JRE의 사양과 맞지 않는다면, 시스템상에서 적절한 구현을 찾아 사용하게 된다.


-help | ?

: java 명령어에 대한 사용 정보만을 jvm 실행하지 않고 출력해준다.


참고

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://catsbi.oopy.io/6136946a-9139-4541-b2af-2af93bb634a5

 

Java Agent(-javaagent:)

javaagent란?

catsbi.oopy.io

 

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