실행중인 JVM의 매개 변수 가져 오기


90

실행중인 JVM의 매개 변수를 가져 오는 방법이 있습니까? JVM의 pid를 입력으로 받아 시작 매개 변수를 반환하는 jstat와 같은 명령 줄 도구가 있습니까? 특히 JVM을 시작할 때 제공된 -Xmx 및 -Xms 값에 관심이 있습니다. 감사합니다.

편집 : 내 제약을 명확히하기 위해. 확인하려는 JVM이 프로덕션 서버에서 실행 중입니다. 그렇기 때문에 우리는 최소한의 중단을 선호합니다. jstat를 사용하여 JVM을 모니터링 할 수 있으므로 매개 변수에 액세스하는 유사한 간단한 솔루션이 있기를 바랍니다.

편집 : 우리는 또한 jvisualvm을 사용하여 매개 변수를 얻으려고했습니다. 그러나 원격 jvm에 연결하려면 jstatd를 실행하고 JVM의 보안 설정을 수정해야합니다.이 설정은 프로덕션 서버에서 매우 파괴적이고 위험합니다.


: 당신은이 도구를 찾을 수 있습니다 JDK 도구 및 유틸리티
기욤 Husta

답변:


146

다음과 같은 jps를 사용할 수 있습니다.

jps -lvm

다음과 같이 인쇄합니다.

4050 com.intellij.idea.Main -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar -Djb.restart.code=88
4667 sun.tools.jps.Jps -lvm -Dapplication.home=/opt/java/jdk1.6.0_22 -Xms8m

6
매력처럼 작동합니다. 또한 비슷한 기능을 가진 jdk에서 jinfo 도구를 발견했습니다
HH

2
의 출력 jps -lvm이 잘못된 것일 수 있습니다. 항상 jinfo 또는 다른 도구로 다시 확인하십시오. "-XX"가 일반 프로그램 인수처럼 전달되고 JVM에서 무시되는 경우 문제가 될 수 있습니다. 당신이 사용하는 경우이 경우가 java -jar my.jar -Xmx3g대신java -Xmx3g -jar my.jar
유라이 마르틴

38

JDK8 문서에 따라 jcmd가 지금 제안 된 접근 방식 이기 때문에이 새로운 답변을 추가하고 있습니다.

향상된 진단 및 성능 오버 헤드 감소를 위해 이전 jstack, jinfo 및 jmap 유틸리티 대신 최신 유틸리티 인 jcmd를 사용하는 것이 좋습니다.

다음은 원하는 속성 / 플래그를 가져 오는 명령입니다.

jcmd pid VM.system_properties
jcmd pid VM.flags

우리는 아래와 같이 jcmd -l을 사용하려면 pid가 필요합니다.

username@users-Air:~/javacode$ jcmd -l 
11441 Test 
6294 Test 
29197 jdk.jcmd/sun.tools.jcmd.JCmd -l 

이제이 pid를 사용하여 원하는 속성 / 플래그를 가져올 시간입니다.

명령 : jcmd 11441 VM.system_properties

11441:
#Tue Oct 17 12:44:50 IST 2017
gopherProxySet=false
awt.toolkit=sun.lwawt.macosx.LWCToolkit
file.encoding.pkg=sun.io
java.specification.version=9
sun.cpu.isalist=
sun.jnu.encoding=UTF-8
java.class.path=.
java.vm.vendor=Oracle Corporation
sun.arch.data.model=64
java.vendor.url=http\://java.oracle.com/
user.timezone=Asia/Kolkata
java.vm.specification.version=9
os.name=Mac OS X
sun.java.launcher=SUN_STANDARD
user.country=US
sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/lib
sun.java.command=Test
http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
jdk.debug=release
sun.cpu.endian=little
user.home=/Users/XXXX
user.language=en
java.specification.vendor=Oracle Corporation
java.home=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
file.separator=/
java.vm.compressedOopsMode=Zero based
line.separator=\n
java.specification.name=Java Platform API Specification
java.vm.specification.vendor=Oracle Corporation
java.awt.graphicsenv=sun.awt.CGraphicsEnvironment
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.runtime.version=9+181
user.name=XXXX
path.separator=\:
os.version=10.12.6
java.runtime.name=Java(TM) SE Runtime Environment
file.encoding=UTF-8
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.vendor.url.bug=http\://bugreport.java.com/bugreport/
java.io.tmpdir=/var/folders/dm/gd6lc90d0hg220lzw_m7krr00000gn/T/
java.version=9
user.dir=/Users/XXXX/javacode
os.arch=x86_64
java.vm.specification.name=Java Virtual Machine Specification
java.awt.printerjob=sun.lwawt.macosx.CPrinterJob
sun.os.patch.level=unknown
MyParam=2
java.library.path=/Users/XXXX/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:.
java.vm.info=mixed mode
java.vendor=Oracle Corporation
java.vm.version=9+181
sun.io.unicode.encoding=UnicodeBig
java.class.version=53.0
socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16

명령 : jcmd 11441 VM.flags 출력 :

11441:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=67108864 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830092 -XX:NonProfiledCodeHeapSize=122914074 -XX:ProfiledCodeHeapSize=122914074 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:-UseAOT -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

jcmd 사용에 대한 자세한 지침은 내 블로그 게시물을 참조하십시오.


일치하는 모든 프로세스를 찾을 수 없습니다 : 'PID'
채널 바스

1
pid는 자바 프로세스 ID로 대체되어야합니다. Linux os는 일반적으로 "ps -ef | 그렙 JDK "이 여러 프로세스를 보면 다음 새 질문을하거나 구글하려고
비핀


22

또는 jinfo 를 사용할 수 있습니다.

jinfo -flags <vmid> 
jinfo -sysprops <vmid>

3
이 유틸리티는 지원되지 않으며 향후 JDK 버전에서 사용 가능하거나 사용 가능하지 않을 수 있습니다.
GoYun.Info

-flags옵션이 OpenJDK 64 비트 서버 VM (빌드 1.8.0_111-internal-alpine-r0-b14)에 존재하지 않습니다 (현재 java:8u111-jdk-alpineDocker 이미지)
Anthony O.

이 답변은 Java 6/7을 염두에두고 작성했습니다. 그있는 jinfo는 신뢰할 수 있지만, 넘어 flags데비안 제시에 따라 공식 도커 자바 이미지와 함께 작동 docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki

15

자바에서 이것을 할 수 있다면 다음을 시도하십시오.

RuntimeMXBean

관리 공장

예:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}

1
전달 된 경우에만 값을 제공하므로 기본 설정이 없습니다.
Behe


3

Linux에서는이 명령을 실행하고 결과를 볼 수 있습니다.

ps aux | grep "java"

우리 회사는 Red Hat Linux를 사용하고 있으며 시스템에 대한 액세스 권한이 매우 제한적입니다. ps aux | grep "java"명령은 jvm 인수와 함께 모든 Java 명령을 나열하며 필요한 경우 정확한 jvm 인수를 grep 할 수도 있습니다. 이것은 jps, jcmd 등과 같은 다른 도구를 사용할 수 없거나 액세스 할 수없는 경우에 매우 유용합니다.
AGan

2

Windows 10 또는 Windows Server 2016은 표준 작업 관리자에서 이러한 정보를 제공합니다. 프로덕션의 경우 드물지만 대상 JVM이 Windows에서 실행중인 경우 해당 매개 변수를 확인하는 가장 간단한 방법은 Ctrl + Alt + Delete를 누르고 프로세스 탭을 선택한 다음 명령 줄 열을 추가하는 것입니다 (오른쪽 마우스 버튼 클릭). 기존 열 헤더).


1

실행중인 Java 프로세스의 JVM 매개 변수를 얻는 데 관심이 있다면 kill -3 java-pid를 수행하십시오. Java 애플리케이션을 시작하는 동안 사용 된 jvm 매개 변수를 찾을 수있는 코어 덤프 파일이 제공됩니다.


0

JConsole 명령 (또는 다른 JMX 클라이언트)을 사용하여 해당 정보에 액세스 할 수 있습니다.


0

이 기술은 로컬 또는 원격에서 실행되는 모든 Java 애플리케이션에 적용됩니다.

  1. Java 애플리케이션을 시작하십시오.
  2. 실행 JVisualVM는 당신을 발견 JDK (예 : C : \ 프로그램 파일 \ 자바 \ jdk1.8.0_05 \ 빈 \ jvisualvm.exe).
  3. 이 유용한 도구가 시작되면 "로컬"트리 노드에서 실행중인 Java 응용 프로그램 목록을 확인합니다.
  4. [응용 프로그램] (pid [n])을 두 번 클릭합니다.
  5. 오른쪽에는 애플리케이션 탭에 검사 내용이 있습니다. 개요 탭 중간에 애플리케이션의 JVM 인수가 표시됩니다.

jvisualvm은 JDK 6 업데이트 7 이후 모든 JDK에서 찾을 수 있습니다 . jvisualvm에 대한 비디오 자습서는 여기에 있습니다.


OP는 jvisualvm이 옵션이 아니라고 명시 적으로 명시했습니다.
Olivier Gérardin

0

_JAVA_OPTIONS는 확장 할 수있는 env 변수입니다.

echo $_JAVA_OPTIONS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.