दिलचस्प पोस्ट
एसएक्सएल सर्वर में चार, एनकर, वर्चार और एनवर्चार के बीच अंतर क्या है? नरम कुंजीपटल खुला प्रोगार्ड अनुकूलन के दौरान अप्रयुक्त स्ट्रिंग्स को निकालना Geom_boxplot में whisker परिभाषा बदल रहा है प्रबंधन स्टूडियो से तेज़ी से वेब से बुलाया जाने पर संग्रहीत प्रक्रिया धीमी हो जाती है SetMobileDataEnabled विधि अब एंड्रॉइड एल के रूप में और बाद में कॉल करने योग्य नहीं है यूनिकोडडेकोड त्रुटि: 'utf8' कोडेक बाइट 0x9c डीकोड नहीं कर सकता IQueryable, सूची, IEnumerator के बीच अंतर? बाश स्क्रिप्ट की स्रोत निर्देशिका को भीतर से प्राप्त करना फ़ंक्शन पॉइंटर के रूप में लैम्ब्डा पास करना जावास्क्रिप्ट काट / टुकड़ा / स्ट्रिंग में अंतिम वर्ण को छानना क्या निकलते समय () माइक्रोसेकंड संकल्प की गारंटी है? AngularJS – एनजी-अक्षम एंकर टैग के लिए काम नहीं कर रहा है मेल मल्टीपार्ट / वैकल्पिक बनाम मल्टीपार्ट / मिश्रित जावास्क्रिप्ट में यूआरएल के जीईटी पैरामीटर का उपयोग करना

जावा मेमोरी उपयोग की निगरानी कैसे करें?

हमारे पास जेबीसी पर चलने वाला एक जे 2 ए एप्लीकेशन है और हम अपनी स्मृति उपयोग को मॉनीटर करना चाहते हैं। वर्तमान में हम निम्नलिखित कोड का उपयोग करते हैं

System.gc(); Runtime rt = Runtime.getRuntime(); long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024; logger.information(this, "memory usage" + usedMB); 

यह कोड ठीक काम करता है इसका मतलब है कि यह स्मृति वक्र दिखाता है जो वास्तविकता से मेल खाती है जब हम डीबी से एक बड़ी एक्सएमएल फाइल बनाते हैं, तो वक्र बढ़ जाता है, निष्कर्षण समाप्त होने के बाद यह नीचे जाता है।

वैकल्पिक शब्द

एक सलाहकार ने हमें बताया कि जीसी () को बुलाकर स्पष्ट रूप से गलत कहा गया है, "जीवीएम जीसी चलाने के बारे में फैसला ले"। असल में उनकी बहसें उसी तरह थीं, जो यहाँ पर असहमत हैं । लेकिन मैं अभी भी समझ नहीं पा रहा हूं:

  • मैं अपनी मेमोरी का उपयोग कर्ज़ कैसे कर सकता हूं?
  • स्पष्ट जीसी () के साथ क्या गलत है? मुझे उन छोटे प्रदर्शन के मुद्दों की परवाह नहीं है जो स्पष्ट जीसी () के साथ हो सकते हैं और जो 1-3% में अनुमान लगाएंगे I मुझे जो मेमोरी और धागा मॉनिटर की जरूरत है, वह मेरी साइट के विश्लेषण के लिए ग्राहक साइट पर मदद करता है।

वेब के समाधान से एकत्रित समाधान "जावा मेमोरी उपयोग की निगरानी कैसे करें?"

यदि आप वास्तव में वीएम मेमोरी में क्या चल रहे हैं, तो आपको विज़ुअल विज़ुअल जैसे अच्छे उपकरण का उपयोग करना चाहिए। यह सॉफ्टवेयर मुफ़्त है और यह देखने का एक शानदार तरीका है कि क्या चल रहा है।

स्पष्ट जीसी () कॉल के साथ कुछ भी वास्तव में "गलत" नहीं है हालांकि, याद रखें कि जब आप जीसी () कॉल करते हैं तो आप "सुझाव दे रहे हैं" कि कचरा कलेक्टर चलाने इसमें कोई गारंटी नहीं है कि वह उस आदेश को चलाने के लिए सही समय पर चलाएगा।

ऐसे उपकरण हैं जो आपको VM के मेमोरी उपयोग को मॉनिटर करते हैं। वीएम मेमोरी आँकड़े जेएमएक्स का उपयोग कर सकता है I आप जीसी आँकड़ों को भी प्रिंट कर सकते हैं यह देखने के लिए कि स्मृति समय पर कैसे प्रदर्शन कर रही है।

Invoking System.gc () जीसी के प्रदर्शन को नुकसान पहुंचा सकता है क्योंकि ऑब्जेक्ट समय से पहले से पुरानी पीढ़ियों तक ले जाया जाएगा, और कमजोर संदर्भों को समय से पहले साफ़ कर दिया जाएगा इससे मेमोरी क्षमता में कमी, जीसी के समय में अधिक समय हो सकता है, और कैश हिट घट जाती है (कैश के लिए जो कमजोर रिफ का इस्तेमाल करते हैं)। मैं आपके सलाहकार से सहमत हूं: System.gc () खराब है। मैं जहाँ तक कमांड लाइन स्विच का उपयोग कर इसे अक्षम करना चाहता हूं।

मैं कहूंगा कि परामर्शदाता सिद्धांत में सही है, और आप व्यवहार में सही हैं। जैसा कि कहा जाता है :

सिद्धांत में, सिद्धांत और व्यवहार समान हैं। व्यवहार में, वे नहीं हैं।

जावा स्पेक का कहना है कि सिस्टम। जीसी कचरा संग्रह को कॉल करने का सुझाव देती है। व्यवहार में, यह सिर्फ एक धागा पैदा कर देता है और सूर्य JVM पर तुरंत चलाता है।

यद्यपि सिद्धांत में आप कचरा संग्रह के कुछ परिष्कृत जेवीएम कार्यान्वयन को गड़बड़ कर सकते हैं, जब तक कि आप किसी भी जेवीएम पर तैनात किए जाने वाले सामान्य कोड लिख रहे हों, इसके बारे में चिंता न करें। अगर यह आपके लिए काम करता है, तो इसे करें

आप मंच मॉनिटर को देख सकते हैं यह एक खुला स्रोत जावा (वेब) अनुप्रयोग प्रदर्शन मॉनिटर है यह प्रतिक्रिया समय मैट्रिक्स, जेवीएम मैट्रिक्स, अनुरोध विवरण (अनुरोध प्रोफ़ाइलर द्वारा प्राप्त कॉल स्टैक सहित) और अधिक का कब्जा कर लेता है। ओवरहेड बहुत कम है

वैकल्पिक रूप से, आप डैटेपॉइंट के लंबे इतिहास को संग्रहीत करने के लिए इसके साथ महान टाइम्सरीज डेटाबेस ग्रेफाइट का उपयोग कर सकते हैं जिसे आप फैंसी डैशबोर्ड के साथ देख सकते हैं

उदाहरण: जेवीएम मेमोरी डैशबोर्ड

स्क्रीनशॉट, फीचर विवरण और दस्तावेज़ीकरण देखने के लिए प्रोजेक्ट वेबसाइट पर एक नज़र डालें।

नोट: मैं मंचमॉन्टर के डेवलपर हूं

क्या आपने जेएमएक्स की कोशिश की है?

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

वैकल्पिक पाठ http://java.sun.com/developer/technicalArticles/J2SE/jconsole/HeapMemory.jpg

JVM तर्क पर एक नज़र डालें: http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#DebuggingOptions

XX: -प्रतिजीसी ​​कचरा संग्रह पर संदेश प्रिंट करें। प्रबंधनीय।

-XX: -PrintGCDetails कचरा संग्रह में अधिक जानकारी प्रिंट करें। प्रबंधनीय। (1.4.0 में प्रस्तुत किया गया।)

-XX: -प्रति GCTimeStamps कचरा संग्रहण पर समय-सीमा मुद्रित करें प्रबंधनीय (1.4.0 में प्रस्तुत किया गया।)

-XX: -प्रिंटटिनेरिंग डिस्ट्रुमेंट प्रिंटिंग उम्र की जानकारी

जब आप System.gc() को System.gc() को स्पष्ट कॉल के साथ परेशान नहीं कर रहे हैं, तो संभवतः आपके द्वारा अपेक्षित प्रभाव नहीं हो सकता है। सचमुच समझते हैं कि जेएमवी में मेमोरी के साथ क्या हो रहा है और कुछ भी पढ़ता है और सब कुछ ब्रायन गेट्स लिखता है।

विजुअल वीएम द्वारा टॉमकेट के अंदर क्या हो रहा है http://www.skill-guru.com/blog/2010/10/05/increasing-permgen-size-in-your-server/ वैकल्पिक शब्द

वैकल्पिक शब्द

स्पष्ट रूप से प्रोडक्शन सिस्टम पर System.gc () चल रहा है एक भयानक विचार है अगर स्मृति किसी भी आकार के लिए हो जाती है, तो पूरे सिस्टम फ्रीज कर सकता है, जबकि एक पूर्ण जीसी चल रहा है। बहु-गीगाबाइट-आकार वाले सर्वर पर, यह आसानी से बहुत ध्यान देने योग्य हो सकता है, इस पर निर्भर करता है कि कैसे jvm कॉन्फ़िगर किया गया है, और कितना हेडरूम है, आदि आदि – मैंने 30 सेकंड से अधिक के पॉज़ देखे हैं।

एक और मुद्दा यह है कि जीसी को स्पष्ट रूप से बुलाकर आप वास्तव में निगरानी नहीं कर रहे हैं कि जीवीएम जीसी कैसे चला रहा है, आप वास्तव में इसे बदल रहे हैं – इस आधार पर कि आपने जेवीएम कैसे कॉन्फ़िगर किया है, यह उचित होने पर कचरा एकत्र करने जा रहा है, और आमतौर पर बढ़ेगा (यह सिर्फ एक पूर्ण जीसी नहीं चलाता जब यह स्मृति से बाहर चलाता है)। आप जो छपाई करेंगे, वह कुछ भी नहीं होगा जो कि जेवीएम खुद पर करेंगे – एक चीज़ के लिए आप शायद कम स्वचालित / वृद्धिशील जीसी देखेंगे क्योंकि आप मैन्युअल रूप से मेमोरी को साफ़ करेंगे।

के रूप में निक होल्ट की पोस्ट बताते हैं, जीसी की गतिविधियों को प्रिंट करने के विकल्प पहले से ही जेवीएम झंडे के रूप में मौजूद हैं।

आपके पास एक धागा हो सकता है जो सिर्फ मुफ़्त और उचित अंतराल पर उपलब्ध प्रिंट करता है, यह आपको वास्तविक मेम उपयोग का दिखाएगा।

यदि आप कमांड लाइन से यह करने का एक अच्छा तरीका पसंद करते हैं तो jstat:

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

यह कॉन्फ़िगर करने योग्य अंतराल पर कच्ची जानकारी देता है जो लॉगिंग और ग्राफ़िंग उद्देश्यों के लिए बहुत उपयोगी है।

यदि आप जावा 1.5 का उपयोग करते हैं, तो आप ManagementFactory.getMemoryMXBean () देख सकते हैं जो आपको सभी प्रकार की मेमोरी पर नंबर देते हैं। ढेर और गैर-ढेर, पैरा-जनरल

एक अच्छा उदाहरण वहाँ पाया जा सकता है http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-primgen-space

यदि आप जेएमएक्स का उपयोग करते हैं तो जीसी के इतिहास में आप का इस्तेमाल किया जा सकता है, तो आप नंबरों के पहले / बाद में इसका इस्तेमाल कर सकते हैं, आपको जीसी को मजबूर नहीं करना पड़ता है।

आपको केवल यह ध्यान रखना चाहिए कि उन जीसी चालें (आमतौर पर एक पुराने और एक नई पीढ़ी के लिए) नियमित अंतराल पर नहीं हैं, इसलिए आपको शुरुआती समय की साजिश रचने की ज़रूरत है (या आप अनुक्रम संख्या के आधार पर प्लॉट करते हैं, अधिकतर के लिए व्यावहारिक प्रयोजन जो साजिश रचने के लिए पर्याप्त होगा)।

उदाहरण के लिए ओआरकेसी हॉटस्पॉट वीएम पर ParNewGC के साथ, एक जेएमएक्स MBean java.lang:type=GarbageCollector,name=PS Scavenge कहा जाता है java.lang:type=GarbageCollector,name=PS Scavenge स्केवेन्ज, इसका एक विशेषता है LastGCInfo, यह पिछले वाईजी स्कैवेस्टर रन का एक कम्पोजिटडेटा देता है। यह duration , पूर्ण memoryUsageBefore और memoryUsageAfter साथ रिकॉर्ड किया जाता memoryUsageBefore और memoryUsageAfter के बाद

सिर्फ उस विशेषता को पढ़ने के लिए टाइमर का उपयोग करें जब भी कोई नया स्टार्टटाइम दिखाता है आपको पता चलता है कि यह एक नई जीसी घटना का वर्णन करता है, तो आप स्मृति जानकारी निकाल सकते हैं और अगले अपडेट के लिए मतदान करते हैं। (सुनिश्चित नहीं है कि किसी भी तरह से AttributeChangeNotification नोटिफिकेशन का उपयोग किया जा सकता है।)

युक्ति: आपके टाइमर में आप आखिरी जीसी रन की दूरी को माप सकते हैं, और अगर यह आपकी साजिश रचने के लिए बहुत लंबा है, तो आप System.gc () को सशर्त रूप से लागू कर सकते हैं लेकिन मैं इसे OLTP उदाहरण में नहीं करेगा

जैसा सुझाव दिया गया है, एक बुनियादी दृश्य प्राप्त करने के लिए VisualVM का प्रयास करें।

अधिक विस्तृत स्मृति विश्लेषण करने के लिए आप एक्लिप्स मेट भी उपयोग कर सकते हैं।

जब तक आप अपने प्रोग्राम की शुद्धता पर निर्भर नहीं करते, तब तक System.gc () को ठीक करना ठीक है।

System.gc के साथ समस्या यह है कि जेवीएम पहले से स्वचालित रूप से मेमोरी उपयोग के आधार पर कचरा कलेक्टर को समय से स्वचालित रूप से आवंटित करता है।

हालांकि, यदि आप हैं, उदाहरण के लिए, एक मोबाइल डिवाइस की तरह एक बहुत ही स्मृति सीमित स्थिति में काम कर रहे हैं, तो System.gc आपको मैन्युअल रूप से इस कचरा संग्रहण के लिए अधिक समय आवंटित करने की अनुमति देता है, लेकिन सीपीयू समय की कीमत पर (लेकिन, जैसा कि आपने कहा था , आप जीसी के प्रदर्शन के मुद्दों के बारे में चिंतित नहीं हैं)।

सर्वोत्तम अभ्यास शायद इसका उपयोग केवल उस स्थान पर होगा जहां आप बड़ी मात्रा में deallocation कर सकते हैं (जैसे कि एक बड़ी सरणी फ्लश करना)।

सभी माना जाता है, क्योंकि आप केवल मेमोरी उपयोग के बारे में चिंतित हैं, जीसी को कॉल करने के लिए बेझिझक, या, अभी तक बेहतर देखें, यह आपके मामले में बहुत मेमोरी अंतर बनाता है, और फिर तय करें।

जवाबों की सूची में जोड़ना, JConsole (jdk / bin निर्देशिका में शामिल) एक भी अच्छा इंटरफ़ेस है जो आज़माएं।

संदर्भ