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-hant/n/333415.html