2012-02-12 13 views
9

का मेमोरी उपयोग प्ले फ्रेमवर्क के मेमोरी उपयोग पर बस एक त्वरित सवाल है। मेरे पास एक उत्पादन उदाहरण है, जो 680768 केबी स्मृति का उपयोग करता प्रतीत होता है। इसमें से अधिकांश स्वैप में स्थित है।Playframework

(वर्चुअल) सर्वर के बारे में 750 एमबी है, लेकिन MySQL सर्वर और 12 अपाचे वर्चुअल सर्वर भी चलाता है। कभी-कभी छोटी अवधि के लिए अस्थायी संवाददाता (या बहुत धीमी) बन जाती है। मुझे लगता है कि यह स्वैपिंग के कारण है (यह सीपीयू नहीं है)।

रूपरेखा है कि अधिक स्मृति की जरूरत है? मैं मेमोरी उपयोग को JVM पैरामीटर -Xmx256m या उसके साथ सीमित कर सकता हूं, लेकिन इसमें क्या मूल्य डालना है, और इसका कारण यह है कि यह कितनी मेमोरी का उपयोग करता है?

इस खेल से उपयोग है! पहले और शुरू होने के बाद:

जावा: ~~~~~ संस्करण: 1.6.0_26 होम: /usr/lib/jvm/java-6-sun-1.6.0.26/jre अधिकतम स्मृति: 194,641,920 नि: शुल्क स्मृति: 11,813,896 कुल स्मृति: 30,588,928 उपलब्ध प्रोसेसर: 2

पुनः आरंभ करने के बाद: जावा: ~~~~~ संस्करण: 1.6.0_26 होम: /usr/lib/jvm/java-6-sun-1.6 .0.26/जेआर अधिकतम मेमोरी: 1 9 4641920 मुफ्त मेमोरी: 98 9 3688 कुल मेमोरी: 21 9 46368 उपलब्ध प्रोसेसर: 2

+0

ऐसे प्रश्न का उत्तर देना बेहद मुश्किल है। यह कई कारकों (जटिलता, कैशिंग, आदि) पर निर्भर करता है - प्ले! एक स्टेटलेस डिज़ाइन को प्रोत्साहित करता है, ताकि स्मृति उपयोग थोड़ा अधिक लगता है (हालांकि जावा के लिए आश्चर्य की बात नहीं है)। क्या आपने सर्वर को पुनरारंभ करने का प्रयास किया और देखा कि मेमोरी पदचिह्न कम हो गया है या नहीं? इसके अलावा, एक मेमोरी डंप आपको इस संकेत को आवंटित करने का संकेत दे सकता है। –

+0

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

+0

में कुछ मेमोरी लीक हो सकती है, मैं इसे प्रश्न में जोड़ दूंगा। वर्तमान 665 एमबी का केवल 71 एमबी सक्रिय स्मृति (शीर्ष) में है। 665 एक स्थिर पर्याप्त आंकड़ा लगता है। Play के पीछे हटने के बाद! आवेदन (और कम से कम एक अनुरोध) शीर्ष पर रिपोर्ट की गई स्मृति 524 मीटर है। (प्रश्न में प्ले द्वारा रिपोर्ट की गई मेमोरी उपयोग डालें) –

उत्तर

5

यह कई चीजों पर निर्भर करता है लेकिन हाँ जावा को मूल आवंटन, ढेर और गैर ढेर स्मृति स्थान के लिए कुछ स्मृति की आवश्यकता है।

प्ले स्थिति का कहना है कि अपने ढेर केवल 30,588,928 बाइट्स की खपत लेकिन स्टार्टअप पर जावा ढेर के लिए 194,641,920 आवंटित करता है। आप ढेर आवंटन को सीमित करने के लिए -Xmx64M से शुरू करने का प्रयास कर सकते हैं।

फिर आप राम के 128 के बारे में मो बचाने लेकिन, जावा भी JVM के लिए स्मृति आवंटित कर सकते हैं, इसलिए प्रक्रिया के पदचिह्न 64 से अधिक मो हो जाएगा, यह आपके मंच पर निर्भर करता है, लेकिन यह कम से कम 200/250 हो जाएगा मो

64Mo करने के लिए अपने ढेर सीमित के साथ प्रयास करें, लेकिन 750 मो JVM और mysql चलाने के लिए पर्याप्त नहीं हो सकता।

ध्यान रखें कि आप जावा के साथ अदला-बदली उपयोग नहीं करना चाहिए क्योंकि स्मृति एक ब्लॉक में आवंटित किया जाता है ताकि आप बाहर पूरे ढेर में/स्वैप स्वैप में है।

+0

धीमी प्रतिक्रिया के लिए खेद है, मुझे अंतर देखने के लिए उचित परीक्षण करने का मौका नहीं मिला। Play चलाने के लिए आदेश, सबसे अच्छा, या यहां तक ​​कि बस तरीका क्या है! -Xmx64M के साथ? –

+4

अपनी application.conf फ़ाइल में, एक पंक्ति "jvm.memory = -Xmx64M" –

+0

जोड़ें मैंने यह किया, और इसने एक बूंद देखी। अधिकतम स्मृति: 249,364,480 रिक्त स्मृति: 20,543,688 कुल स्मृति: 59,219,968 उपलब्ध प्रोसेसर: 2 शीर्ष देता है: अधिकतम स्मृति: (Virt) 627m (रेस) 185m परिवर्तन के बाद परिवर्तन से पहले 64,880,640 रिक्त स्मृति: 2,793,576 कुल स्मृति: 53,366,784 उपलब्ध प्रोसेसर: 2 शीर्ष देता है (गंदगी) 470m (रेस) 199m तो ले जाएगा -Xmx64M सही मूल्य ढांचे से समझौता किए बिना में डाल करने के लिए हो सकता है? यह मेरे लिए थोड़ा अस्पष्ट है कि इसे एक तरह से करने के कारण क्या हैं या दूसरे (मुझे पता है मुझे पढ़ना चाहिए!) –

6

मुझे लगता है कि आप जिस 680768 केबी की रिपोर्टिंग कर रहे हैं वह ओएस उपकरण जैसे पीएस या टास्क मैनेजर से है। जेवीएम द्वारा उपयोग की जाने वाली स्मृति की कुल मात्रा ऐप की अस्थायी ठंड नहीं कर रही है। विराम का संभावित कारण यह है कि जेवीएम कचरा कलेक्टर एक पूर्ण जीसी चला रहा है जो जेवीएम में सभी धागे को निलंबित कर देगा जो पूर्ण जीसी चल रहा है (जब तक कि आपके पास एक समवर्ती जीसी कॉन्फ़िगर नहीं किया गया हो)।

आपको जेवीएम को प्लेफ्रेमवर्क चलाने के साथ -verbosegc -XX: + PrintGCDetails को देखना चाहिए कि जीसी क्या कर रहा है।

आपका प्रश्न "क्या प्ले फ्रेमवर्क को उस स्मृति की आवश्यकता है" का उत्तर नहीं दिया जा सकता है क्योंकि उपयोग की गई स्मृति की मात्रा इस बात पर निर्भर करेगी कि आपका आवेदन पूर्व अनुरोध आधार पर क्या कर रहा है। इसके अलावा जेवीएम हीप को चलाने देगा और फिर ढेर को साफ करने के लिए जीसी चक्र करेगा। एक अच्छी तरह से व्यवहार किया गया JVM ऐप जीसी ग्राफ पर एक दांत दांत पैटर्न दिखाना चाहिए।

मुझे नहीं पता कि आप किस जेवीएम का उपयोग कर रहे हैं यदि आप हॉटस्पॉट वीएम का उपयोग कर रहे हैं तो जेवीएम ट्यूनिंग गाइड पढ़ें। http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html समझने के लिए मार्गदर्शिका के लिए JVM ट्यूनिंग मार्गदर्शिका पढ़ने से पहले आपको आमतौर पर निम्नलिखित जीसी अवधारणाओं को समझने की आवश्यकता है।

  • मार्क और स्वीप कूड़ा संग्रह
  • मार्क, स्वीप और कॉम्पैक्ट कूड़ा संग्रह
  • कॉपी कलेक्टर
  • पीढ़ीगत कूड़ा संग्रह
  • समानांतर कूड़ा संग्रह
  • समवर्ती कूड़ा संग्रह

http://www.amazon.com/Garbage-Collection-Handbook-Management-Algorithms/dp/1420082795/ समर्थक है bably इस विषय

मुक्त उपकरण है कि हॉटस्पॉट JVM है कि आप उपयोग कर सकते हैं के साथ जहाज के एक जोड़े पर एक अच्छी किताब JConsole, और jvisualvm शामिल हैं। jvisualvm में VisualGC नामक एक अच्छी प्लगइन है जो सीखने में बहुत बढ़िया है कि हॉटस्पॉट वीएम मेमोरी कैसे प्रबंधित करता है।

संबंधित मुद्दे