Java JPS (Java虛擬機進程狀態工具) 是Java JDK中的一個命令行工具,用於查看Java進程的狀態信息。本文將從多個方面對Java JPS進行詳細闡述。
一、JPS的基本用法
JPS可用於查看當前運行的Java進程信息。在命令行中輸入「jps」即可查看當前運行的所有Java進程PID和進程名。
$ jps 1234 Main 5678 Tomcat 8910 Jps
其中,PID表示進程ID,進程名為啟動Java進程時所指定的主類的名稱。
如果要查看指定Java進程的PID,可以通過「-l」參數查看完整的進程名,然後通過grep命令過濾:
$ jps -l |grep Main 1234 Main
除了「-l」參數之外,JPS還支持其他常用的參數:
- -m:顯示進程中啟動主類時的參數
- -v:顯示進程中啟動主類時的JVM參數
- -q:只輸出PID
二、使用JPS定位Java進程的問題
JPS除了可以查看Java進程的狀態信息,還可以用於定位Java進程的問題。以下是幾種常見的問題:
1. Java進程OOM
如果Java進程遇到OOM (內存溢出)問題,可以通過JPS查看對應的進程ID,並查看內存情況。
$ jps 1234 Main $ jstat -gcutil 1234 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 85.19 73.00 86.50 68.63 349 4.131 11 0.705 4.836
jstat命令用於監視Java虛擬機的各種運行狀態,例如垃圾回收情況。以上命令將輸出對應進程的堆內存狀態。從中可以看到目前堆內存已經使用了86.50%。
2. Java進程卡死
如果Java進程卡死,可以使用JPS查看對應的進程ID,並使用jstack命令查看堆棧信息。使用jstack命令可以查看Java進程的堆棧信息,定位卡死的程序段。
$ jps 1234 Main $ jstack 1234
三、JPS與Java Management Extensions (JMX)
Java Management Extensions (JMX) 是一種Java平台管理系統。JMX提供了一組標準API用於管理和監視Java應用程序,可以實現對應用程序的監控、控制和管理。
JPS與JMX結合使用可以監聽Java進程的狀態信息,包括內存、線程、GC情況等。使用JConsole (Java GUI監測工具) 和jvisualvm (Java VisualVM工具) 可以以圖形化界面的形式展示各種指標。以下是幾個常用的命令:
- jstatd:啟動jstat監測服務
- jconsole:啟動Java GUI監測工具
- jvisualvm:啟動Java VisualVM工具
四、JPS命令的實際應用
JPS命令可以用於實際開發中的各種場景。以下是幾個例子:
1. 檢查Java進程是否啟動
在自動化測試和運維中,我們需要檢查Java進程是否正常啟動。可以使用JPS命令來檢查Java進程是否正常運行。
private boolean checkProcessRunning(String processName) {
String line;
String pidAndName;
try {
Process p = Runtime.getRuntime().exec("jps -l");
try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
while ((line = input.readLine()) != null) {
pidAndName = line.trim();
if (pidAndName.endsWith(processName)) {
return true;
}
}
}
} catch (Exception err) {
err.printStackTrace();
}
return false;
}
2. 獲取Java進程信息
在應用程序中需要獲取Java進程的狀態信息,例如進程ID、內存、線程、GC情況等。可以使用JPS命令結合JMX API來獲取Java進程的狀態信息。
public class JvmInfo {
private static MBeanServerConnection getMBeanServerConnection(int pid) throws IOException {
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + getRegistryPort(pid) + "/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL);
return jmxConnector.getMBeanServerConnection();
}
private static int getRegistryPort(int pid) throws IOException {
String command = String.format("service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi", findRmiRegistryPort(pid));
JMXServiceURL jmxUrl = new JMXServiceURL(command);
JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxUrl, null);
return jmxConnector.getServerConnection().getAddress().getPort();
}
private static int findRmiRegistryPort(int pid) throws IOException {
String pidString = String.valueOf(pid);
String[] cmd = { "jps", "-v" };
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = input.readLine()) != null) {
if (line.contains(pidString)) {
return Integer.valueOf(line.split("-Dcom.sun.management.jmxremote.port=")[1].split("\\s+")[0]);
}
}
return 0;
}
public static void printJvmInfo(int pid) throws IOException {
MBeanServerConnection conn = getMBeanServerConnection(pid);
MemoryMXBean memoryMXBean = ManagementFactory.newPlatformMXBeanProxy(conn, ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);
System.out.println("heap memory usage : " + memoryMXBean.getHeapMemoryUsage());
System.out.println("non-heap memory usage : " + memoryMXBean.getNonHeapMemoryUsage());
ThreadMXBean threadMXBean = ManagementFactory.newPlatformMXBeanProxy(conn, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
System.out.println("thread count : " + threadMXBean.getThreadCount());
System.out.println("GC count : " + memoryMXBean.getCollectionCount());
for (GarbageCollectorMXBean gcMbean : ManagementFactory.getGarbageCollectorMXBeans()) {
System.out.println(gcMbean.getName() + " GC count : " + gcMbean.getCollectionCount());
}
}
}
結論
本文中詳細闡述了Java JPS的基本用法、與Java進程問題的定位、與JMX的結合使用和實際應用。通過JPS命令,可以更好地監測和管理Java應用程序。
原創文章,作者:PZPUG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333415.html
微信掃一掃
支付寶掃一掃