jcmd Java 7 से शामिल एक शक्तिशाली JVM डायग्नोस्टिक कमांड-लाइन टूल है जो स्थानीय मशीन पर चल रहे JVM प्रक्रियाओं को डायग्नोस्टिक कमांड भेजने की अनुमति देता है। यह उत्पादन समस्या निवारण, प्रदर्शन विश्लेषण और JVM आंतरिक स्थिति के निरीक्षण के लिए आवश्यक है।
बुनियादी उपयोग
# सभी JVM प्रक्रियाएं सूचीबद्ध करें
jcmd -l
# विशिष्ट प्रक्रिया को कमांड भेजें
jcmd [arguments]
# उपलब्ध कमांड देखें (PID से जुड़ने के बाद)
jcmd help
# फ़ाइल से कमांड चलाएं
jcmd -f commands.txt
प्रक्रिया सूचीकरण
$ jcmd -l
12345 com.example.MyApplication
12346 jdk.jcmd/sun.tools.jcmd.JCmd -l
12347 org.gradle.launcher.daemon.bootstrap.GradleDaemon 12345
आवश्यक डायग्नोस्टिक कमांड्स
1. मेमोरी और हीप विश्लेषण
# हीप उपयोग सारांश
jcmd GC.class_histogram
# विस्तृत हीप उपयोग
jcmd GC.heap_info
# हीप डंप उत्पन्न करें (हप्रोफ फॉर्मेट)
jcmd GC.heap_dump /path/to/heap.hprof
# हीप डंप लाइव ऑब्जेक्ट्स के साथ
jcmd GC.heap_dump -all /path/to/heap.hprof
2. थ्रेड विश्लेषण
# थ्रेड डंप (स्टैक ट्रेस)
jcmd Thread.print
# थ्रेड डंप लॉक जानकारी के साथ
jcmd Thread.print -l
# केवल डेडलॉक पता लगाएं
jcmd Thread.print -deadlock
3. VM जानकारी और कॉन्फ़िगरेशन
# VM संस्करण और फ्लैग्स
jcmd VM.version
jcmd VM.flags
# सिस्टम प्रॉपर्टीज
jcmd VM.system_properties
# कमांड लाइन आर्गुमेंट्स
jcmd VM.command_line
# अपटाइम
jcmd VM.uptime
4. फ्लाइट रिकॉर्डर (JFR) - Java 9+
# रिकॉर्डिंग शुरू करें
jcmd JFR.start name=MyRecording settings=profile duration=60s filename=recording.jfr
# रिकॉर्डिंग स्थिति जांचें
jcmd JFR.check
# रिकॉर्डिंग रोकें
jcmd JFR.stop name=MyRecording
# रिकॉर्डिंग डंप करें
jcmd JFR.dump name=MyRecording filename=recording.jfr
5. क्लास लोडिंग और JIT
# लोड की गई कक्षाएं
jcmd VM.classloader_stats
# JIT कंपाइलेशन
jcmd Compiler.directives_print
jcmd Compiler.queue
6. डायनामिक लॉगिंग (Java 9+)
# लॉग कॉन्फ़िगरेशन देखें
jcmd VM.log list
# लॉगिंग बदलें (उदाहरण: GC लॉगिंग सक्षम करें)
jcmd VM.log disable
jcmd VM.log output=stdout,level=info,what=gc+heap
व्यावहारिक उदाहरण: मेमोरी लीक जांच
#!/bin/bash
# memory-leak-check.sh
PID=$1
if [ -z "$PID" ]; then
echo "उपयोग: $0 "
exit 1
fi
echo "=== JVM मेमोरी विश्लेषण PID $PID के लिए ==="
# 1. हीप सारांश
echo "--- हीप जानकारी ---"
jcmd $PID GC.heap_info
# 2. क्लास हिस्टोग्राम (ऑब्जेक्ट गिनती)
echo "--- शीर्ष 20 ऑब्जेक्ट प्रकार ---"
jcmd $PID GC.class_histogram | head -30
# 3. थ्रेड डंप
echo "--- थ्रेड डंप ---"
jcmd $PID Thread.print
# 4. हीप डंप लें (विश्लेषण के लिए)
DUMP_FILE="/tmp/heap_${PID}_$(date +%s).hprof"
echo "--- हीप डंप सहेज रहे हैं: $DUMP_FILE ---"
jcmd $PID GC.heap_dump $DUMP_FILE
echo "विश्लेषण के लिए Eclipse MAT या VisualVM में $DUMP_FILE खोलें"
जावा प्रोग्राम से jcmd का उपयोग करना
import java.lang.management.ManagementFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class JCmdProgrammatic {
public static void main(String[] args) throws Exception {
// वर्तमान प्रक्रिया PID प्राप्त करें
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
System.out.println("वर्तमान PID: " + pid);
// jcmd चलाएं
ProcessBuilder pb = new ProcessBuilder("jcmd", pid, "GC.heap_info");
Process process = pb.start();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}
}
उत्पादन में सर्वोत्तम अभ्यास
- कम प्रभाव: jcmd कमांड्स हल्के हैं और उत्पादन में सुरक्षित हैं
- हीप डंप आकार: बड़े हीप्स के लिए GBs हो सकते हैं - डिस्क स्थान सुनिश्चित करें
- सुरक्षा: समान उपयोगकर्ता या उचित अनुमतियों की आवश्यकता
- स्वचालन: मॉनिटरिंग सिस्टम (Prometheus, Datadog) के साथ एकीकृत करें
- दस्तावेज़ीकरण:
jcmdचलाकर अपने JDK संस्करण के लिए सटीक कमांड्स खोजेंhelp
आम समस्याएं
| समस्या | समाधान |
|---|---|
| "प्रक्रिया नहीं मिली" | सही PID सत्यापित करें, समान उपयोगकर्ता के रूप में चलाएं |
| "कमांड उपलब्ध नहीं" | jcmd चलाकर उपलब्ध कमांड्स देखें |
| हीप डंप विफल | डिस्क स्थान, अनुमतियां जांचें, -all फ्लैग आज़माएं |
| कंटेनर में PID | कंटेनर के अंदर PID 1 का उपयोग करें, या होस्ट PID नेमस्पेस |
सारांश
jcmd उत्पादन JVM डायग्नोस्टिक्स के लिए स्विस आर्मी चाकू है। यह हीप डंप, थ्रेड डंप, JFR रिकॉर्डिंग, GC विश्लेषण और डायनामिक लॉगिंग के लिए सुरक्षित, कम-ओवरहेड पहुंच प्रदान करता है - सभी बिना एप्लिकेशन को पुनः आरंभ किए। प्रत्येक Java ऑपरेशंस इंजीनियर और डेवलपर को इसके मुख्य कमांड्स से परिचित होना चाहिए।