Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java 9 में jcmd टूल का महत्व: JVM डायग्नोस्टिक्स

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 help चलाकर अपने JDK संस्करण के लिए सटीक कमांड्स खोजें

आम समस्याएं

समस्यासमाधान
"प्रक्रिया नहीं मिली"सही PID सत्यापित करें, समान उपयोगकर्ता के रूप में चलाएं
"कमांड उपलब्ध नहीं"jcmd help चलाकर उपलब्ध कमांड्स देखें
हीप डंप विफलडिस्क स्थान, अनुमतियां जांचें, -all फ्लैग आज़माएं
कंटेनर में PIDकंटेनर के अंदर PID 1 का उपयोग करें, या होस्ट PID नेमस्पेस

सारांश

jcmd उत्पादन JVM डायग्नोस्टिक्स के लिए स्विस आर्मी चाकू है। यह हीप डंप, थ्रेड डंप, JFR रिकॉर्डिंग, GC विश्लेषण और डायनामिक लॉगिंग के लिए सुरक्षित, कम-ओवरहेड पहुंच प्रदान करता है - सभी बिना एप्लिकेशन को पुनः आरंभ किए। प्रत्येक Java ऑपरेशंस इंजीनियर और डेवलपर को इसके मुख्य कमांड्स से परिचित होना चाहिए।

  1. Java में GridBagConstraints क्लास का महत्व क्या है? Java में GridBagConstraints क्लास का महत्व क्या है?

    एक GridBagLayout एक बहुत ही लचीला लेआउट प्रबंधक है जो हमें कंस्ट्रेंट्स का उपयोग करके घटकों को एक दूसरे के सापेक्ष स्थिति देने की अनुमति देता है। प्रत्येक GridBagLayout सेल के एक गतिशील आयताकार ग्रिड का उपयोग करता है जिसमें प्रत्येक घटक एक या अधिक सेल पर कब्जा करता है जिसे इसका प्रदर्शन क्षेत्र कहा

  1. Java में SwingWorker क्लास का महत्व क्या है Java में SwingWorker क्लास का महत्व क्या है

    एक SwingWorker क्लास हमें एक वर्कर थ्रेड में एक असिंक्रोनस टास्क (जैसे लंबे समय तक चलने वाला टास्क) करने में सक्षम बनाती है फिर टास्क परिणामों के आधार पर इवेंट डिस्पैच थ्रेड (EDT) से Swing कंपोनेंट्स को अपडेट करती है। इसे Java 1.6 संस्करण में पेश किया गया था।SwingWorker क्लासjava.swing.SwingWorker क

  1. Java में SwingUtilities क्लास का महत्व क्या है? Java में SwingUtilities क्लास का महत्व क्या है?

    Java में, स्विंग कंपोनेंट्स स्क्रीन पर प्रदर्शित होने के बाद, केवल एक थ्रेड द्वारा संचालित किए जा सकते हैं जिसे इवेंट हैंडलिंग थ्रेड कहा जाता है। हम अपना कोड एक अलग ब्लॉक में लिख सकते हैं और इस ब्लॉक का रेफरेंस इवेंट हैंडलिंग थ्रेड को दे सकते हैं। SwingUtilities क्लास में दो महत्वपूर्ण स्टेटिक मेथड्