2010-05-28 25 views
26

हमारे पास एक PHP वेबैप है जो एक पीडीएफ रिपोर्ट (जैस्परपोर्ट के साथ) बनाने के लिए जावा बाइनरी को कॉल करता है, जावा बाइनरी आउटपुट पीडीएफ आउटपुट आउटपुट और एक्स्टिट्स के लिए, php फिर पीडीएफ ब्राउज़र पर भेजता है। यह जावा कमांड लगभग 3 से 6 सेकेंड तक रहता है, मुझे लगता है कि जब यह 6 सेकेंड तक रहता है तो जीसी किक करता है, इसलिए मैं इसे अक्षम करना चाहता हूं क्योंकि वैसे भी जब आदेश बाहर निकलता है तो सभी मेमोरी वापस आती है ..मैं जावा कचरा कलेक्टर को कैसे अक्षम कर सकता हूं?

मुझे पसंद है कैसे जावा 1.4.2 के लिए और के लिए जावा 1.6.0 उसे निष्क्रिय करने क्योंकि वर्तमान में हम जो तेजी से प्रदर्शन को देखने के लिए दोनों JVM परीक्षण कर रहे हैं पता करने के लिए ..

धन्यवाद

+7

बस एक अन्य दृष्टिकोण के लिए एक संकेत (क्योंकि प्रक्रिया शुरू करने में समय लगता है): http: // github।com/hudora/pyJasper में एक (जावा) सर्वर होता है जो प्रक्रिया स्टार्टअप/शट डाउनहेड के बिना अनुरोध पर जैस्परपोर्ट चलाता है। – ZeissS

+0

विशिष्ट वस्तुओं के लिए संबंधित: http://stackoverflow.com/questions/1329926/how-to-prevent-an-object-from-getting-garbage-collected –

उत्तर

25

कचरा संग्रह को पूरी तरह से अक्षम करने का कोई तरीका नहीं है। कचरा संग्रह केवल तभी चलाया जाता है जब JVM अंतरिक्ष से बाहर हो जाता है, ताकि आप प्रोग्राम को और अधिक स्मृति दे सकें। जावा कमांड

-Xmx256M -Xms256M 

पर यह कमांड लाइन विकल्प जोड़ें यह प्रोग्राम 256 एमबी रैम (डिफ़ॉल्ट 64 एमबी) देता है। कचरा संग्रह में डिफ़ॉल्ट आकार JVM के लिए 3 सेकंड नहीं लगेगा, इसलिए आप प्रोग्राम की क्या अपेक्षा कर रहे हैं और अधिक बारीकी से जांच करना चाहेंगे। Yourkit profiler यह जानने के लिए बहुत उपयोगी है कि लंबे समय तक क्या चल रहा है।

24

जीसी केवल में किक जब JVM स्मृति पर कम है , तो आप या तो जीसी या मर जाते हैं। वर्बोज़ जीसी चालू करने का प्रयास करें और देखें कि वास्तव में इसमें काफी समय लगता है या नहीं।

java -verbose:gc 
+1

उम्म, तो शायद मैं इसे और अधिक देने के लिए कमांडलाइन स्विच का उपयोग कर सकता हूं स्मृति और इसलिए जीसी में शामिल होने का मौका बढ़ाना .. – Nelson

+1

हां, आपको पता चलेगा कि आपको वर्बोज़ के आउटपुट का विश्लेषण करने के बाद ऐसा करने की आवश्यकता है: gc। यह पहला कदम है। "परीक्षण, अनुमान न करें" के लिए – unbeli

+6

+1। समय diff कुछ पूरी तरह से असंबंधित हो सकता है, जैसे I/O विवाद या कुछ CPU भारी प्रक्रिया में लात मारना। – gustafc

1

क्या आप सुनिश्चित हैं कि यह कचरा संग्रह मंदी के कारण है? क्या आपने जावा को -verbose के साथ चलाया है: जीसी क्या हो रहा है यह देखने के लिए?

आप जेवीएम पर कचरा संग्रह अक्षम नहीं कर सकते हैं। हालांकि बेहतर प्रदर्शन के लिए आप कचरा कलेक्टर tuning देख सकते हैं।

2

आप अधिकतम ढेर आकार सेट करने के लिए -Xmx विकल्प का उपयोग कर सकते हैं; एक बड़े ढेर का उपयोग करके वीएम को स्मृति से बाहर निकलने से रोकना चाहिए और इस प्रकार, जल्द ही कचरा संग्रह की आवश्यकता होती है।

+2

बस सेटिंग -Xmx कोई फर्क नहीं पड़ता। प्रारंभिक ढेर आकार को नियंत्रित करना चाहते हैं, इसलिए आपको वास्तव में -Xms सेट करने की आवश्यकता है। –

33

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

+1

अच्छा एक ... यह जैस्पर प्रारंभिक भी बचाएगा, मुझे लगता है। – helios

+0

हां, यह अच्छा दृष्टिकोण है हालांकि करने के लिए और अधिक काम करने के लिए, मुझे एक प्रकार का डिमन कोड करना होगा जो सॉकेट पर सुनता है और इसी तरह .. इसके अलावा "डेमॉन" को X दिनों में एक बार फिर से शुरू करना होगा .. जावा लंबे समय तक (मेरे अनुभव से) मेमोरी लीक .. – Nelson

+0

@ नेल्सन यह देखने पर विचार करें कि क्या आप अपनी जावा प्रक्रियाओं को होस्ट करने के लिए मुले की तरह कुछ उपयोग कर सकते हैं और यह आपके लिए सभी संचारों को संभालने दें। विचार यह है कि आपको बस अपने जैस्परपोर्ट्स को ऐसी सेवा के रूप में एम्बेड करने की आवश्यकता है जो ईएसबी आवश्यक हो सके अनुरोधों को होस्ट और रूट कर सके। मुले: http://www.mulesoft.com/mule-esb-open-source-esb –

0

जैसा कि सभी ने कहा है कि आप जेवीएम में जीसी को अक्षम नहीं कर सकते हैं, जो सही समझ में आता है, क्योंकि अगर जावा के कारण मेमोरी लीक हो सकती है तो डेवलपर के ढेर डेटा को हटाने का स्पष्ट तरीका नहीं है।

क्या आपके पास इस जावा बाइनरी के स्रोत तक पहुंच है? यदि ऐसा है तो यह विश्लेषण करने के लायक हो सकता है और देख सकता है कि क्या कोई बोतल-गर्दन है जो जीसी गतिविधि को कम करने के लिए बेहतर लिखा जा सकता है। उदाहरण के लिए जेपीरोब जैसे अधिकांश जावा प्रोफाइलर्स के साथ यह किया जा सकता है।

+0

जावा बाइनरी बहुत आसान है, यह केवल कमांडलाइन पैरामीटर्स को पुनर्प्राप्त करता है और रिपोर्ट बनाने के लिए जेस्पररपोर्ट फ़ंक्शंस में कॉल करता है, जो System.out outputstream को पास किया जाता है जहां PHP इसे 'पासथ्रू' फ़ंक्शन के माध्यम से पढ़ता है। तो जसपरपोर्ट पर रिपोर्ट की खरीद करने का समय बिताया गया है, इस प्रकार मैं जावा सामान्य गतिशीलता चाहता था। – Nelson

+0

ऐसा लगता है कि जेवीएम जीसी सेटिंग्स को नियंत्रित करना आपके यहां एकमात्र एवेन्यू है। – display101

0

किसी भी वस्तु से कचरा कलेक्टर रिहाई एक चर या संपत्ति से बचने के लिए आप अपने वर्ग यह मेरा समाधान था में इस संपत्ति (जीसी द्वारा जारी) स्थिर के रूप में सेट करना होगा।

उदाहरण:

निजी स्थिर स्ट्रिंग myProperty;

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