2009-06-16 14 views
25

ठीक है, सवाल गूंगा प्रतीत हो सकता है, लेकिन मैं इसे वैसे भी पूछ रहा हूं।जेएआर फाइलें, क्या वे सिर्फ ब्लॉउट नहीं करते हैं और जावा को धीमा करते हैं?

स्प्रिंग + ब्लेज़डीएस प्रोजेक्ट को चलाने और चलाने के लिए घंटों तक संघर्ष करने के बाद, मुझे पता चला कि स्प्रिंग इत्यादि के लिए सही निर्भरताओं को शामिल करने के परिणामस्वरूप मुझे अपनी परियोजना में समस्याएं आई थीं। मेरे वेब से .jars गायब थे। -आईएनएफ/lib फ़ोल्डर, हाँ, मुझे मूर्खतापूर्ण।

थोड़ी देर के बाद, मैं उन सभी .jar फ़ाइलों को प्राप्त करने में कामयाब रहा जहां वे हैं, और यह उस पर 12.5 एमबी की भारी संख्या में आता है, और से अधिक है! जो मुझे चिंतित करता है, लेकिन शायद यह और उम्मीद है कि चिंतित नहीं होना चाहिए।

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

मेरे प्रश्न हैं: जब उदाहरण के लिए कहते हैं कि

करता जावा स्मृति में एक पूरे .jar फ़ाइल लोड कि .jar में एक वर्ग instantiated है? उस सामान के बारे में क्या है जो .jar में है जो कभी भी उपयोग नहीं किया जाता है।

क्या .jars अनुकूलित अनुप्रयोग प्रदर्शन के लिए किसी भी तरह से कैश किया जाता है?

जब कोई एकल .jar लोड होता है, तो मैं समझता हूं कि यह चीज़ स्मृति में बैठती है और कई HTTP अनुरोधों (यानी सर्वर इंस्टेंस के जीवनकाल के लिए) में उपलब्ध है, PHP के विपरीत जहां प्रत्येक के साथ फ्लाई पर ऑब्जेक्ट बनाए जाते हैं अनुरोध, क्या यह धारणा सही है?

वसंत का उपयोग करते समय, मैं सोच रहा हूं, मुझे उन सभी को शामिल करना था। Jars, क्या मैं केवल मूल जावा का उपयोग करके बेहतर नहीं होगा, कम से कम और ओआरएम समाधान जैसे हाइबरनेट?

अभी तक वसंत में अतिरिक्त समय, अतिरिक्त हार्ड ड्राइव स्थान, अतिरिक्त मेमोरी, सीपीयू खपत को कॉन्फ़िगर करने में अतिरिक्त समय लगा है, इसलिए मुझे चिंता है कि ढांचे के लिए आवेदन करने के लिए बहुत अधिक एप्लिकेशन प्रदर्शन की लागत होगी, उदाहरण के लिए आईओसी मेरे BlazeDS सर्वर।

अभी भी ओआरएम, एक इकाई परीक्षण ढांचे और बिट्स और टुकड़े यहां और वहां आना है। एक परियोजना को जल्दी और बेझिझक आसानी से ब्लूट करना इतना आसान है।

मैं लाइन कहां खींचूं?

+0

.jar फ़ाइलों के बजाय आप क्या सुझाव देंगे? – immibis

+0

मैंने 6 साल पहले इस सवाल से पूछा। जावा कुछ लोड/लिंक कैसे करता है इस पर कुछ दिलचस्प उत्तर दिए गए हैं। मैं एक विकल्प की तलाश नहीं कर रहा था, बल्कि अनुकूलन में रूचि रखता था। –

उत्तर

50

"क्या जावा जब कहते हैं कि उदाहरण के लिए कि .jar में एक वर्ग instantiated है स्मृति में एक पूरे .jar फ़ाइल लोड? सामान .jar कि कभी नहीं इस्तेमाल किया जाता है में है कि के बारे में क्या। "

नहीं है, वर्ग लोडर प्रत्येक .class फ़ाइल के रूप में की जरूरत है लोड करता है।

" .jars किसी भी तरह इसे साफ़ कर करें , के लिए आवेदन प्रदर्शन अनुकूलित "

जार (बनाम वर्ग लोड हो रहा है जोड़ने के बारे में जानकारी के लिए छोड़कर) सिर्फ DLLs की तरह हैं:। वे .class फ़ाइलों के बस संकुचित पुस्तकालयों नहीं हैं तो वे कैश नहीं कर रहे हैं: .class फाइलें आर ई आवश्यकतानुसार परम स्पेस में लोड किया गया।

"जब एक भी .jar भरी हुई है, मैं समझता हूँ उस चीज़ स्मृति में बैठता है और कई HTTP अनुरोध पर उपलब्ध पीएचपी जहां के विपरीत, (सर्वर उदाहरण के जीवन चलाने के लिए यानी) है ऑब्जेक्ट प्रत्येक अनुरोध के साथ फ्लाई पर बनाया गया है, क्या यह धारणा सही है? "

जब आपका ऐप सर्वर एक .class को अनुमति स्थान में लोड करता है, तो यह तब तक उपलब्ध है जब तक सर्वर चालू और चल रहा हो।

"स्प्रिंग का उपयोग कर, मैं सोच रहा हूँ, मैं उन सभी बारीकियों .jars, शामिल करने के लिए मैं सिर्फ बेहतर नहीं होगा सिर्फ निवासी जावा का उपयोग कर, के साथ कह कम से कम और ORM समाधान था हाइबरनेट की तरह? "

यदि आपको लगता है कि वसंत का उपयोग करके आप कुछ खरीद रहे हैं। यदि आपको नहीं लगता कि लागत/लाभ विश्लेषण आपको पसंद करता है, तो हर तरह से वसंत का उपयोग नहीं करते हैं। लेकिन ऐसा नहीं लगता है कि निर्भरताएं आपको अलग कर रही हैं, तो आप एक अच्छा विश्लेषण कर रहे हैं।

"अब तक, स्प्रिंग सिर्फ अतिरिक्त समय विन्यस्त, अतिरिक्त हार्ड ड्राइव स्थान, अतिरिक्त स्मृति, CPU खपत ले लिया है, तो मैं कर रहा हूँ चिंतित है कि ढांचे के बहुत ज्यादा आवेदन प्रदर्शन की लागत आने का जा रहा है उदाहरण के लिए, आईओसी ने मेरे BlazeDS सर्वर के साथ कार्यान्वित किया। "

आपको पता नहीं है कि वसंत का उपयोग करने के लिए प्रदर्शन दंड क्या है। अगर आपको लगता है कि यह एक समस्या है तो इसे मापें। मेरी शर्त यह है कि आपका एप्लिकेशन कोड या डेटाबेस स्कीमा सबसे बड़ी समस्या होगी।

"वहाँ अभी भी ORM, एक इकाई परीक्षण ढांचे और बिट्स और टुकड़े यहाँ और वहाँ आने के लिए है। यह सिर्फ इतना आसान एक परियोजना जल्दी से गैर जिम्मेदाराना आसानी से ब्लोट और करने के लिए है।"

गैर जिम्मेदार क्यों?

"मैं लाइन कहां खींचूं?"

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

का एक बेहतर विचार होगा

मैं इसे जोड़ दूंगा: वसंत में लोग कुछ बेहतरीन कोड लिखते हैं। आप जो कुछ भी लिखेंगे या उससे बेहतर होगा। आप कोई फ्रेमवर्क चुनते हैं क्योंकि आप मानते हैं कि आपको कोड का उपयोग करने से लिफ्ट मिलेगी कठोर रूप से इंजीनियर, व्यापक दर्शक हैं, और अधिक अच्छी तरह से परीक्षण किया गया है। और जो भी आप खुद लिखते हैं उससे लगभग हर उपाय से बेहतर होता है। मैं (स्वीकार्य रूप से) बड़ी संख्या में निर्भरताओं को इसका उपयोग करने से रोक नहीं देता। जब मैं तैनाती करता हूं एक ऐप सर्वर पर और उस जेवीएम में 256 एमबी रैम आवंटित करें, मैं प्रमाणित करता हूं अगर परम स्पेस उस कुल का 10% खपत करता है तो मुझे बहुत ज्यादा परवाह नहीं है - जब तक कि मैं मापता हूं कि यह एक समस्या है।

मुझे लगता है कि वास्तव में क्या चल रहा है यह है कि आप जावा के बजाय PHP लिखना चाहते हैं। यह एक उचित विचार है, क्योंकि बहुत से लोग सोचते हैं कि गतिशील भाषाओं का उपयोग जावा पर मूल्य प्रदान कर सकता है। अधिकांश साइटें अभी भी PHP में लिखी गई हैं, इसलिए आपका संदेह न्यायसंगत है।

मैं वसंत के साथ और बिना PHP के उपयोग के दो या दो का उपयोग प्रोटोटाइप करने की अनुशंसा करता हूं। उसके बाद आपके लिए क्या काम करता है इसका एक बेहतर अर्थ होगा।

+0

अच्छी प्रतिक्रिया, हालांकि अगर आप उद्धरण के लिए मार्कडाउन का उपयोग करते हैं तो इसे पढ़ने के लिए बहुत आसान होगा रेखा की शुरुआत पर हस्ताक्षर करें, या पाठ को हाइलाइट करें और टेक्स्ट क्षेत्र के ऊपर उद्धरण चिह्न पर क्लिक करें। –

+0

मैंने कोटेशन के लिए मार्कडाउन जोड़ने के लिए संपादित किया है। मैंने जानबूझकर डबल-कोट्स छोड़े, इसलिए अगर कोई पाठ की प्रतिलिपि बनाता है और पेस्ट करता है, तो यह अभी भी स्पष्ट होगा कि उद्धरण कौन सा है। –

+0

धन्यवाद, बिल। – duffymo

5

क्लासलोडर केवल उन वर्गों को लोड करना चाहिए जिन्हें वे चाहते हैं और वे स्मृति-निवासी रहते हैं। 12 एमबी के बारे में चिंता मत करो। राम सस्ता है। आपके द्वारा बनाए गए ऑब्जेक्ट्स (बड़े एप्लिकेशन में) लोड होने वाली कक्षाओं की तुलना में कहीं अधिक स्मृति का उपयोग करेंगे।

तो संक्षेप में, इसके बारे में चिंता न करें। :)

शीर्षक के साथ आईबीएम डेवलपर पर एक अच्छा लेख है "Demystifying वर्ग लोड हो रहा है समस्याओं, भाग 1: वर्ग लोड हो रहा है और डिबगिंग टूल का परिचय"

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

+1

उल्लिखित आलेख: http://www.ibm.com/developerworks/java/library/j-dclp1/ – Trenton

1

उन प्रश्नों में से कुछ के लिए, आप शायद java.util.jar में स्रोत कोड को देखकर सबसे अच्छे हैं। जेएआर फाइलों को ज़िप फ़ाइल के प्रकार के रूप में माना जाता है (जो समझ में आता है क्योंकि जेएआर फाइल मूल रूप से एक मेनिफेस्ट फ़ाइल के साथ ज़िप फाइलें हैं), इसलिए पूरी फाइल एक बार में लोड नहीं होती है।

3

यदि आपको निर्भरता प्रबंधन में समस्याएं आ रही हैं, तो Maven या Ivy जैसे टूल में मदद मिल सकती है, हालांकि वे अपने स्वयं के सीखने के घटते हैं। वे दोनों आपको सीधे निर्भरताओं को निर्दिष्ट करने की अनुमति देते हैं और उपकरण को संक्रमणीय निर्भरताओं की गणना और हल करने देते हैं।

+0

धन्यवाद, मैं इसे ध्यान में रखूंगा, और यह जानकर कि मैवेन और आइवी सीखने की वक्र के साथ आते हैं। –

2

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

जोड़ना अधिक जार शायद अतिरिक्त स्थान (जार जानकारी) की कुछ KB (<) ले जाएगा, लेकिन वास्तव में अपने PermGenSpace में वृद्धि नहीं होगा जब तक कि वर्ग की आवश्यकता नहीं है (प्रत्यक्ष या परोक्ष) की आवश्यकता

तो तुम सुरक्षित हैं जब तक आप सभी अनावश्यक वर्गों को संदर्भित नहीं करते हैं (उपयोग के माध्यम से: सीधे या परोक्ष रूप से कक्षाओं में स्थिर कोड निष्पादन सहित) को अतिरिक्त पुस्तकालयों को जोड़ने के लिए।

इसके अलावा पर्मगेन स्पेस हीप मेमोरी (भौतिक स्मृति आवंटन के संदर्भ में) से अलग है हालांकि वे एक साथ काम करते हैं।

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