Nhận các tham số của một JVM đang chạy


90

Có cách nào để lấy các tham số của một JVM đang chạy không? Có công cụ dòng lệnh nào như jstat lấy pid đầu vào của JVM và trả về các tham số bắt đầu của nó không? Tôi đặc biệt quan tâm đến các giá trị -Xmx và -Xms đã được đưa ra khi khởi động JVM. Cảm ơn bạn.

Chỉnh sửa : Để làm rõ ràng buộc của tôi. JVM mà chúng tôi muốn kiểm tra đang chạy trên máy chủ sản xuất. Đó là lý do tại sao, chúng tôi thích sự gián đoạn tối thiểu. Chúng tôi có thể giám sát JVM bằng cách sử dụng jstat và vì vậy chúng tôi hy vọng có một giải pháp đơn giản tương tự để truy cập các tham số.

Chỉnh sửa : Chúng tôi cũng đã cố gắng lấy các tham số bằng jvisualvm. Nhưng để kết nối với jvm từ xa, chúng tôi cần chạy jstatd và sửa đổi cài đặt bảo mật của JVM, cài đặt mà chúng tôi thấy là rất gián đoạn và rủi ro trên máy chủ sản xuất.


Bạn có thể tìm thấy một công cụ ở đó: JDK Tools and Utilities
Guillaume Husta

Câu trả lời:


145

Bạn có thể sử dụng jps như

jps -lvm

in một cái gì đó giống như

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
Hoạt động như một sự quyến rũ. Tôi cũng đã phát hiện ra công cụ jinfo trong jdk có chức năng tương tự
HH

2
Lưu ý rằng đầu ra của jps -lvmcó thể bị sai lệch. Luôn kiểm tra kỹ bằng jinfo hoặc công cụ khác. Vấn đề có thể là nếu "-XX" được truyền như đối số chương trình bình thường và bị JVM bỏ qua. Đây là trường hợp nếu bạn sử dụng java -jar my.jar -Xmx3gthay vìjava -Xmx3g -jar my.jar
Juraj Martinka

36

Tôi đang thêm câu trả lời mới này vì theo tài liệu JDK8, jcmd được đề xuất cách tiếp cận bây giờ.

Bạn nên sử dụng tiện ích mới nhất, jcmd thay vì các tiện ích jstack, jinfo và jmap trước đây để chẩn đoán nâng cao và giảm chi phí hiệu suất.

Dưới đây là các lệnh để lấy thuộc tính / cờ bạn muốn.

jcmd pid VM.system_properties
jcmd pid VM.flags

Chúng tôi cần pid, để sử dụng jcmd -l, như bên dưới

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

Giờ đã đến lúc sử dụng các pids này để nhận các thuộc tính / cờ bạn muốn

Lệnh: 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

Lệnh: jcmd 11441 Đầu ra 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 

Để biết thêm hướng dẫn về cách sử dụng jcmd, hãy xem bài đăng trên blog của tôi


Không thể tìm thấy bất kỳ quy trình nào phù hợp: 'pid'
Ch Vas

1
pid nên được thay thế bằng id quy trình java, hệ điều hành Linux nói chung chúng tôi lấy nó bằng “ps -ef | grep jdk”, nếu bạn thấy nhiều quy trình của thành viên này sau đó đặt một câu hỏi mới hoặc cố gắng để google nó
Vipin


21

Ngoài ra, bạn có thể sử dụng jinfo

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

3
Tiện ích này không được hỗ trợ và có thể có hoặc có thể không có trong các phiên bản JDK trong tương lai.
GoYun.Info

-flagstùy chọn không tồn tại trong OpenJDK 64-Bit Server VM (bản dựng 1.8.0_111-internal-alpine-r0-b14) ( java:8u111-jdk-alpinehình ảnh Docker hiện tại )
Anthony O.

Tôi đã viết câu trả lời này với Java 6/7 trong tâm trí. Ngoài jinfo đó là không đáng tin cậy, nhưng flagslàm việc với hình ảnh java Docker chính thức dựa trên Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki

15

Nếu bạn có thể làm điều này trong java, hãy thử:

RuntimeMXBean

ManagementFactory

Thí dụ:

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

1
Sẽ chỉ cung cấp các giá trị nếu nó được vượt qua, do đó không có cài đặt mặc định.
Behe

8

JConsole có thể làm được. Ngoài ra, bạn có thể sử dụng công cụ jvisualVM mạnh mẽ, công cụ này cũng được bao gồm trong JDK kể từ 1.6.0.8.


3

Trên linux, bạn có thể chạy lệnh này và xem kết quả:

ps aux | grep "java"

Công ty của tôi sử dụng Red Hat Linux và tôi có quyền truy cập rất hạn chế vào hệ thống. ps aux | Lệnh grep "java" liệt kê tất cả các lệnh java với các đối số jvm của chúng và thậm chí chúng ta có thể gửi grep đối số jvm chính xác nếu cần. Điều này thực sự hữu ích trong trường hợp bất kỳ công cụ nào khác như jps, jcmd, v.v. không khả dụng / không thể truy cập được.
AG

1

Windows 10 hoặc Windows Server 2016 cung cấp thông tin như vậy trong trình quản lý tác vụ tiêu chuẩn của chúng. Một trường hợp hiếm gặp đối với sản xuất, nhưng nếu JVM đích đang chạy trên Windows, cách đơn giản nhất để xem các thông số của nó là nhấn Ctrl + Alt + Delete, chọn tab Processes và thêm cột Dòng lệnh (bằng cách nhấp vào nút chuột phải trên bất kỳ tiêu đề cột hiện có).


1

Nếu bạn quan tâm đến việc lấy các tham số JVM của một quy trình java đang chạy, thì chỉ cần thực hiện kill -3 java-pid. Bạn sẽ nhận được một tệp kết xuất cốt lõi trong đó bạn có thể tìm thấy các tham số jvm được sử dụng khi khởi chạy ứng dụng java.


0

Bạn có thể sử dụng lệnh JConsole (hoặc bất kỳ ứng dụng khách JMX nào khác) để truy cập thông tin đó.


0

Kỹ thuật này áp dụng cho bất kỳ ứng dụng java nào chạy cục bộ hoặc từ xa.

  1. Khởi động ứng dụng java của bạn.
  2. Chạy JVisualVM có trong JDK của bạn (chẳng hạn như C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Khi công cụ hữu ích này bắt đầu, hãy xem danh sách ứng dụng java đang chạy trong nút cây "Cục bộ".
  4. Nhấp đúp vào [ứng dụng của bạn] (pid [n]).
  5. Ở phía bên phải sẽ có nội dung kiểm tra trong tab cho ứng dụng. Ở giữa tab Tổng quan, bạn sẽ thấy các đối số JVM cho ứng dụng.

jvisualvm có thể được tìm thấy trong bất kỳ JDK nào kể từ JDK 6 Update 7. Video hướng dẫn về jvisualvm ở đây.


OP đã tuyên bố rõ ràng rằng jvisualvm không phải là một lựa chọn.
Olivier Gérardin

0

_JAVA_OPTIONS là một biến env có thể được mở rộng.

echo $_JAVA_OPTIONS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.