Java में -Xms और -Xmx: JVM को तेज़ कैसे करें और सर्वर को न मारें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका Java प्रोग्राम "धीमा" क्यों हो रहा है और -Xms और -Xmx से इसे कैसे ठीक करें?

\n

क्या आपने कभी कोई Java एप्लिकेशन चलाया है जो पहले घड़ी की तरह काम करता था, और एक घंटे बाद "धीमा" होने लगा, और फिर OutOfMemoryError त्रुटि के साथ क्रैश हो गया? या, इसके विपरीत, सर्वर सारी RAM का उपयोग कर रहा था, लेकिन केवल 20% का ही उपयोग कर रहा था? सबसे अधिक संभावना है, समस्या हीप सेटिंग्स में है — -Xms और -Xmx। ये दो पैरामीटर प्रदर्शन और स्थिरता के बीच संतुलन की कुंजी हैं।

\n

इस लेख में, हम समझेंगे कि -Xms और -Xmx वास्तव में क्या करते हैं, उन्हें आपके एप्लिकेशन के लिए सही तरीके से कैसे चुनें, और कोड उदाहरण दिखाएंगे जो आपको सामान्य गलतियों से बचने में मदद करेंगे। तैयार हैं? चलिए शुरू करते हैं!

\n\n

-Xms और -Xmx क्या हैं? JVM पैरामीटर की व्याख्या

\n

संक्षेप में: -Xms हीप का प्रारंभिक आकार सेट करता है, और -Xmx अधिकतम आकार सेट करता है। लेकिन शैतान, हमेशा की तरह, विवरण में है।

\n
    \n
  • -Xms (Initial Heap Size) — मेमोरी की वह मात्रा जो JVM स्टार्टअप पर आरक्षित करेगा। यदि आप -Xms512m निर्दिष्ट करते हैं, तो वर्चुअल मशीन तुरंत 512 MB आवंटित करेगी।
  • \n
  • -Xmx (Maximum Heap Size) — वह ऊपरी सीमा जिस तक हीप बढ़ सकता है। उदाहरण के लिए, -Xmx4g का मतलब है कि JVM कभी भी 4 GB से अधिक का उपयोग नहीं करेगा।
  • \n
\n

यह महत्वपूर्ण क्यों है? JVM कोई "रबर" वातावरण नहीं है। यदि आप बहुत कम प्रारंभिक मेमोरी (-Xms) आवंटित करते हैं, तो प्रोग्राम हीप का विस्तार करने के लिए बार-बार garbage collector (GC) को कॉल करेगा, जिससे काम धीमा हो जाता है। यदि आप बहुत बड़ा -Xmx सेट करते हैं, तो आप सिस्टम की सारी मेमोरी "खा" सकते हैं, और OS स्वैप करना शुरू कर देगा — प्रदर्शन कई गुना गिर जाएगा।

\n\n

व्यावहारिक उदाहरण: Java एप्लिकेशन के लिए मेमोरी कैसे कॉन्फ़िगर करें

\n

मान लीजिए कि हमारे पास Spring Boot पर एक वेब सर्वर है जो उपयोगकर्ता अनुरोधों को संसाधित करता है। JVM सेटिंग्स के बिना, यह डिफ़ॉल्ट मानों का उपयोग करेगा (Java संस्करण और RAM की मात्रा पर निर्भर करता है), जो अक्सर समस्याओं का कारण बनता है।

\n

यहाँ एक सरल कोड है जो दिखाता है कि वर्तमान हीप पैरामीटर की जाँच कैसे करें:

\n
public class MemoryCheck {\n    public static void main(String[] args) {\n        Runtime runtime = Runtime.getRuntime();\n        long maxMemory = runtime.maxMemory(); // -Xmx\n        long initialMemory = runtime.totalMemory(); // वर्तमान हीप आकार (-Xms के करीब हो सकता है)\n        long freeMemory = runtime.freeMemory();\n\n        System.out.println("अधिकतम मेमोरी (-Xmx): " + maxMemory / (1024 * 1024) + " MB");\n        System.out.println("वर्तमान हीप आकार: " + initialMemory / (1024 * 1024) + " MB");\n        System.out.println("खाली: " + freeMemory / (1024 * 1024) + " MB");\n    }\n}
\n

इस कोड को बिना किसी फ़्लैग के चलाएँ — आप डिफ़ॉल्ट मान देखेंगे। अब JVM तर्क जोड़ें: -Xms256m -Xmx1g। परिणाम नाटकीय रूप से बदल जाएगा: प्रारंभिक हीप 256 MB और अधिकतम 1 GB हो जाएगा।

\n\n

पैरामीटर कैसे पास करें?

\n

कमांड लाइन से चलाते समय:

\n
java -Xms256m -Xmx2g -jar myapp.jar
\n

डेवलपमेंट एनवायरनमेंट (IntelliJ IDEA, Eclipse) में — रन कॉन्फ़िगरेशन सेटिंग्स में। Docker कंटेनरों के लिए — JAVA_OPTS वेरिएबल के माध्यम से।

\n\n

प्रदर्शन अनुकूलन: सही मान कैसे चुनें

\n

सुनहरा नियम: production वातावरण के लिए -Xms को -Xmx के बराबर होना चाहिए। क्यों? यह मेमोरी में "उछाल" और garbage collector के अनावश्यक कॉल को रोकता है। JVM हीप के विस्तार में समय बर्बाद नहीं करेगा, बल्कि तुरंत एक निश्चित मात्रा प्राप्त करेगा।

\n

हालाँकि, कुछ बारीकियाँ हैं:

\n