รับพารามิเตอร์ของ JVM ที่รันอยู่


92

มีวิธีรับพารามิเตอร์ของ JVM ที่รันอยู่หรือไม่? มีเครื่องมือบรรทัดคำสั่งเช่น jstat ซึ่งใช้เป็นอินพุต pid ของ JVM และส่งกลับพารามิเตอร์เริ่มต้นหรือไม่ ฉันสนใจเป็นพิเศษในค่า -Xmx และ -Xms ที่ได้รับเมื่อเริ่ม JVM ขอขอบคุณ.

แก้ไข : เพื่อชี้แจงข้อ จำกัด ของฉัน JVM ที่เราต้องการตรวจสอบกำลังทำงานบนเซิร์ฟเวอร์ที่ใช้งานจริง นั่นเป็นเหตุผลว่าทำไมเราจึงต้องการให้มีการหยุดชะงักน้อยที่สุด เราสามารถตรวจสอบ JVM โดยใช้ jstat ดังนั้นเราหวังว่าจะมีวิธีง่ายๆที่คล้ายกันในการเข้าถึงพารามิเตอร์

แก้ไข : เราพยายามรับพารามิเตอร์โดยใช้ jvisualvm แต่ในการเชื่อมต่อกับ jvm ระยะไกลเราจำเป็นต้องเรียกใช้ jstatd และแก้ไขการตั้งค่าความปลอดภัยของ JVM ซึ่งเราพบว่าก่อกวนและมีความเสี่ยงอย่างมากในเซิร์ฟเวอร์ที่ใช้งานจริง


คุณสามารถค้นหาเครื่องมือได้ที่นั่น: JDK Tools and Utilities
Guillaume Husta

คำตอบ:


148

คุณสามารถใช้ 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
ใช้งานได้เหมือนมีเสน่ห์ ฉันยังค้นพบเครื่องมือ jinfo ใน jdk ซึ่งมีฟังก์ชันคล้ายกัน
HH

2
สังเกตว่าผลลัพธ์ของjps -lvmอาจทำให้เข้าใจผิด ตรวจสอบอีกครั้งด้วย jinfo หรือเครื่องมืออื่น ๆ ปัญหาอาจเกิดขึ้นได้ถ้าส่ง "-XX" เหมือนอาร์กิวเมนต์ของโปรแกรมปกติและถูกละเว้นโดย JVM ในกรณีนี้ถ้าคุณใช้java -jar my.jar -Xmx3gแทนjava -Xmx3g -jar my.jar
Juraj Martinka

39

ฉันกำลังเพิ่มคำตอบใหม่นี้เนื่องจากตามเอกสาร JDK8 jcmd เป็นแนวทางที่แนะนำในขณะนี้

ขอแนะนำให้ใช้ยูทิลิตี้ล่าสุด jcmd แทนยูทิลิตี้ jstack, jinfo และ jmap ก่อนหน้าเพื่อการวินิจฉัยที่ดีขึ้นและค่าใช้จ่ายด้านประสิทธิภาพที่ลดลง

ด้านล่างนี้คือคำสั่งเพื่อรับคุณสมบัติ / แฟล็กที่คุณต้องการ

jcmd pid VM.system_properties
jcmd pid VM.flags

เราต้องการ pid สำหรับสิ่งนี้ใช้ jcmd -l เช่นด้านล่าง

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

ตอนนี้ถึงเวลาใช้ pids เหล่านี้เพื่อรับคุณสมบัติ / แฟล็กที่คุณต้องการ

คำสั่ง: 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'
Ch Vas

1
ควรแทนที่ pid ด้วยรหัสกระบวนการ java โดยทั่วไปแล้วระบบปฏิบัติการ Linux จะได้รับโดย“ ps -ef | grep jdk” หากคุณเห็นหลายกระบวนการตามนี้ให้ถามคำถามใหม่หรือลอง Google ดู
Vipin


22

หรือคุณสามารถใช้jinfo

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

3
ยูทิลิตี้นี้ไม่ได้รับการสนับสนุนและอาจมีหรือไม่มีใน JDK เวอร์ชันอนาคต
GoYun

-flagsตัวเลือกไม่มีอยู่ใน OpenJDK 64-Bit Server VM (build 1.8.0_111-internal-alpine-r0-b14) ( java:8u111-jdk-alpineอิมเมจ Docker ปัจจุบัน)
Anthony O

ฉันเขียนคำตอบนี้โดยคำนึงถึง Java 6/7 นอกเหนือจาก jinfo นั้นไม่น่าเชื่อถือ แต่ใช้flagsงานได้กับอิมเมจ Docker java อย่างเป็นทางการจาก Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki

16

หากคุณสามารถทำได้ใน java ให้ลอง:

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" แสดงรายการคำสั่ง java ทั้งหมดพร้อมอาร์กิวเมนต์ jvm และเรายังสามารถ grep อาร์กิวเมนต์ jvm ที่แน่นอนได้หากจำเป็น สิ่งนี้มีประโยชน์มากในกรณีที่เครื่องมืออื่น ๆ เช่น jps, jcmd ฯลฯ ไม่พร้อมใช้งาน / เข้าถึงได้
AGan

2

Windows 10 หรือ Windows Server 2016 ให้ข้อมูลดังกล่าวในตัวจัดการงานมาตรฐาน เป็นกรณีที่หายากสำหรับการผลิต แต่ถ้า JVM เป้าหมายทำงานบน Windows วิธีที่ง่ายที่สุดในการดูพารามิเตอร์คือกด Ctrl + Alt + Delete เลือกแท็บกระบวนการและเพิ่มคอลัมน์บรรทัดคำสั่ง (โดยคลิกปุ่มเมาส์ขวาบน ส่วนหัวคอลัมน์ที่มีอยู่)


1

หากคุณสนใจที่จะรับพารามิเตอร์ JVM ของกระบวนการ java ที่รันอยู่ให้ทำการ kill -3 java-pid คุณจะได้ไฟล์ดัมพ์หลักซึ่งคุณสามารถค้นหาพารามิเตอร์ jvm ที่ใช้ในขณะเปิดแอปพลิเคชัน java


0

คุณสามารถใช้คำสั่ง JConsole (หรือไคลเอนต์ JMX อื่น ๆ ) เพื่อเข้าถึงข้อมูลนั้น


0

เทคนิคนี้ใช้กับแอปพลิเคชัน java ใด ๆ ที่รันโลคัลหรือรีโมต

  1. เริ่มแอปพลิเคชัน java ของคุณ
  2. เรียกใช้JVisualVMพบใน JDK ของคุณ (เช่น C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe)
  3. เมื่อเครื่องมือที่มีประโยชน์นี้เริ่มต้นให้ดูที่รายการแอปพลิเคชันจาวาที่เรียกใช้ภายใต้โหนดโครงสร้าง "Local"
  4. ดับเบิลคลิก [แอปพลิเคชันของคุณ] (pid [n])
  5. ทางด้านขวาจะมีเนื้อหาการตรวจสอบในแท็บสำหรับแอปพลิเคชัน ตรงกลางแท็บภาพรวมคุณจะเห็นอาร์กิวเมนต์ JVM สำหรับแอปพลิเคชัน

jvisualvm สามารถพบได้ใน JDK ตั้งแต่ JDK 6 อัปเดต 7 วิดีโอสอนเกี่ยวกับ jvisualvm อยู่ที่นี่


OP ระบุอย่างชัดเจนว่า jvisualvm ไม่ใช่ตัวเลือก
Olivier Gérardin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.