2012-01-12 27 views
9

Tôi muốn có được các thuộc tính hệ thống được đặt cho quy trình java/JVM của bên thứ ba. Tôi cần phải làm điều này theo chương trình. Ví dụ, lấy thuộc tính "java.class.path". Tôi có thể làm cái này như thế nào?Làm cách nào để có được thuộc tính hệ thống cho một cá thể JVM cụ thể theo lập trình?

Tôi biết chúng tôi có thể nhận được các thuộc tính cho một chương trình java mà chúng tôi viết bằng System.getProperty(). Nhưng tôi cần lấy các thuộc tính hệ thống cho một JVM của bên thứ ba. Làm thế nào tôi có thể có được như vậy?

+1

Bạn có ý nghĩa gì với JVM của bên thứ ba? Bạn đang đề cập đến một JVM mà bạn không thể chạy mã của bạn? – adarshr

+0

Chỉ cần hỏi chương trình đang chạy trong JVM của bên thứ ba để biết thông tin –

+0

Vâng, ý tôi là .. Tôi không thể chạy mã java của tôi trên JVM đó. Cách khác, có thể kết nối với một JVM cụ thể và chạy mã java của bạn trên đó không? – user1131528

Trả lời

15

Nếu bởi JVM của bên thứ ba bạn chỉ có nghĩa là một JVM khác thì bạn nên thử jinfo. Điều này sẽ không làm việc với tất cả các triển khai JVM, nhưng hầu hết có thể có nó hoặc một cái gì đó tương tự. jinfo lấy id tiến trình làm đối số (hoặc hệ thống từ xa, xem man jinfo). Để tìm quá trình sử dụng id của quá trình jps hoặc jps -v.

 
jinfo 74949 
Attaching to process ID 74949, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 20.4-b02-402 
Java System Properties: 

java.runtime.name = Java(TM) SE Runtime Environment 
sun.boot.library.path = /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries 
java.vm.version = 20.4-b02-402 
awt.nativeDoubleBuffering = true 
... 
+0

Cảm ơn Roger !!! Đó sẽ là đầu ra tôi đang tìm :) Nhưng lệnh jinfo không chạy trên thực thi JVM của tôi. Nó yêu cầu một lá cờ cụ thể và không đổ tất cả các thuộc tính hệ thống Java như mong muốn. Tôi đang sử dụng Java 1.6.0.29 thực hiện trên một hộp Windows. Có cách nào khác không? – user1131528

+0

Tài liệu chỉ ra rằng nó sẽ hoạt động tương tự trên các cửa sổ. Bạn đã thử jinfo -flags hoặc jinfo -sysprops ? –

+0

tôi đã thử cả hai options..But buồn thay, nó ném thông điệp này lại tôi :( Cách sử dụng: jinfo

0

Để programetically truy cập số liệu thống kê từ xa JVM (thông số hệ thống JVM, statististics Chủ đề, thông tin Memomy, Thông tin GC và các thông tin khác), JMX có thể được sử dụng. Đối với điều đó, JVM từ xa phải cho phép kết nối JMX (Check this on how to activate JMX in remote JVM). Về cơ bản bạn cần sau thông số -D được đặt trong JVM từ xa với giá trị thích hợp:

-Dcom.sun.management.jmxremote.port=1234 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname=127.0.0.1 

Khi thiết lập ở trên được thực hiện, kết nối với cổng JMX và nhận được thông tin MBean khác nhau từ các máy chủ từ xa từ ứng dụng của bạn: Sau đây là một số mã mẫu:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + HOST + ":" + PORT + "/jmxrmi"); 
JMXConnector jmxConnector = JMXConnectorFactory.connect(url); 
MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection(); 

Với điều này mbeanServerConnection, bạn có thể truy cập các bean được quản lý khác và nhận thông tin bắt buộc từ hạt MX. Đối với các thuộc tính hệ thống, bạn cần lấy bean RuntimeMXBean và gọi getSystemProperties() để nhận tất cả các tham số hệ thống.

Các vấn đề liên quan