2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Spring Boot कार्यक्रमस्य JVM पैरामीटर् सेटिंग् प्रारूपं (Tomcat स्टार्टअप प्रत्यक्षतया bin निर्देशिकायां catalina.sh सञ्चिकायां योजितं भवति):
जावा -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:मेटास्पेसआकार = 256M -XX:मैक्समेटास्पेसआकार = 256M -जार सूक्ष्मसेवा-यूरेका-सर्वर.जार
उपसंहारः - १.
-Xss सेटिङ्ग् यथा लघु भवति तथा गणना मूल्यं लघु भवति, यस्य अर्थः अस्ति यत् थ्रेड् स्टैक् मध्ये न्यूनानि स्टैक् फ्रेम्स् आवंटयितुं शक्यन्ते, परन्तु थ्रेड् इत्यस्य संख्या यत् उद्घाटयितुं शक्यते तत् समग्ररूपेण JVM कृते अधिका भविष्यति
-Xss: प्रत्येकस्य थ्रेड् इत्यस्य स्टैक् आकारः, पूर्वनिर्धारितः 1M
-Xms: ढेरस्य प्रारम्भिकं उपलब्धं आकारं सेट् कुर्वन्तु, पूर्वनिर्धारितं भौतिकस्मृतेः 1/64 भवति
-Xmx: ढेरस्य अधिकतमं उपलब्धं आकारं सेट् कुर्वन्तु, पूर्वनिर्धारितं भौतिकस्मृतेः 1/4 भवति
-Xmn: नवीन पीढी आकार
-XX:NewRatio: पूर्वनिर्धारित 2 इत्यस्य अर्थः अस्ति यत् नूतनपीढी पुरातनपीढीयाः 1/2 भागं सम्पूर्णस्य ढेरस्मृतेः 1/3 भागं च धारयति ।
-XX:SurvivorRatio: पूर्वनिर्धारित 8 इत्यस्य अर्थः अस्ति यत् एकः जीवितः क्षेत्रः Eden स्मृतेः 1/8 भागं, अर्थात् नूतनपीढीस्मृतेः 1/10 भागं गृह्णाति ।
मेटास्पेस् विषये द्वौ JVM मापदण्डौ स्तः: -XX:MetaspaceSize=N तथा -XX:MaxMetaspaceSize=N
-XX: MaxMetaspaceSize: अधिकतमं मेटास्पेस् आकारं सेट् कुर्वन्तु, यस्य अर्थः अस्ति यत् सीमा नास्ति, अथवा केवलं स्थानीयस्मृतिआकारेन सीमितम् अस्ति ।
-XX: MetaspaceSize: Fullgc (मेटास्पेस् कृते कोऽपि नियतः प्रारम्भिकः आकारः नास्ति), बाइट्-रूपेण प्रवर्तयितुं प्रारम्भिकं सीमां निर्दिशतु यदा एतत् मूल्यं प्राप्तं भवति तदा प्रकारस्य अनलोडिंग् कृते पूर्णं gc उत्प्रेरितं भविष्यति संग्राहकः एतत् मूल्यं समायोजयिष्यति: यदि बृहत् परिमाणं स्थानं मुक्तं भवति तर्हि मूल्यं समुचितरूपेण न्यूनीकरोतु यदि अल्पं स्थानं मुक्तं भवति, तर्हि -XX:MaxMetaspaceSize (यदि सेट्) अधिकं विना मूल्यं समुचितरूपेण वर्धयन्तु अस्य पूर्ववर्ती jdk संस्करणेषु -XX:PermSize पैरामीटर् इत्यस्मात् भिन्नः अर्थः अस्ति -XX:PermSize स्थायी पीढीयाः आरम्भिकक्षमताम् प्रतिनिधियति ।
यतः मेटास्पेस् इत्यस्य आकारान्तरणाय Full GC इत्यस्य आवश्यकता भवति, यदि अनुप्रयोगस्य आरम्भे Full GC इत्यस्य बहूनां संख्या भवति तर्हि प्रायः स्थायी जनरेशनस्य अथवा मेटास्पेस् इत्यस्य आकारान्तरणस्य कारणेन भवति generally recommended to JVM पैरामीटर्स् मध्ये, MetaspaceSize तथा MaxMetaspaceSize इत्येतयोः समानमूल्ये सेट् करोमि, तथा च तान् प्रारम्भिकमूल्यात् बृहत्तरं सेट् करोमि 8G भौतिकस्मृतियुक्तस्य यन्त्रस्य कृते, अहं सामान्यतया द्वयोः मूल्ययोः 256M इति सेट् करोमि ।
HotSpot वर्चुअल् मशीन् इत्यस्मिन् स्मृतौ संगृहीतवस्तूनाम् विन्यासः त्रयः क्षेत्राणि विभक्तुं शक्यते : object header (Header), instance data (Instance Data) तथा alignment padding (Padding) इति HotSpot वर्चुअल् मशीनस्य ऑब्जेक्ट् हेडर् मध्ये सूचनायाः द्वौ भागौ समाविष्टौ भवतः प्रथमभागस्य उपयोगः ऑब्जेक्ट् इत्यस्य एव रनटाइम् डाटा संग्रहणार्थं भवति, यथा हैश कोड् (HashCode), GC जनरेशन आयुः, लॉक् स्थितिध्वजः, थ्रेड् द्वारा धारितः लॉक् , पूर्वाग्रही धागा ID, Favor timestamps इत्यादयः। वस्तुशीर्षकस्य अन्यः भागः प्रकारसूचकः अस्ति, यः वस्तुनः तस्य वर्गमेटाडाटा प्रति सूचकः भवति आभासीयन्त्रं वस्तु कस्य वर्गस्य उदाहरणम् इति निर्धारयितुं एतत् सूचकं उपयुज्यते ।
1. 64-बिट् मञ्चे HotSpot इत्यस्मिन् 32-बिट् पॉइण्टर् (वास्तविक भण्डारणं 64-बिट् उपयुज्यते) इत्यस्य उपयोगेन मुख्यस्मृतेः तथा कैशस्य मध्ये आँकडानां स्थानान्तरणार्थं बृहत्तरस्य सूचकस्य उपयोगः बृहत्तरं बैण्डविड्थं गृह्णाति तस्मिन् एव काले जीसी अपि अधिकं दबावेन भविष्यति
2. 64-बिट्-मञ्चेषु स्मृति-उपभोगं न्यूनीकर्तुं सूचक-संपीडन-कार्यं सक्षमं कुर्वन्तु
3. jvm इत्यस्मिन् 32-बिट्-सङ्केताः 4G पर्यन्तं स्मृति-समर्थनं कुर्वन्ति (2 तः 32-तम-शक्तिपर्यन्तं), यत् वस्तु-सूचकं heap-स्मृतौ संगृहीतं भवति चेत् संपीड्य एन्कोड् कृत्वा, बहिः निष्कास्य डिकोड् कृत्वा च अनुकूलितं कर्तुं शक्यते cpu रजिस्टरं प्रति (वस्तुसूचकः ढेरे अस्ति इदं 32 बिट्स्, रजिस्टर् मध्ये 35 बिट्, 35th power = 32G यावत् 2), jvm केवलं उपयोगेन बृहत्तरस्मृतिविन्यासान् (32G इत्यस्मात् न्यूनं वा समानं वा) समर्थयितुं अनुमतिं ददाति ३२-बिट्-सङ्केताः
4. यदा ढेरस्मृतिः 4G इत्यस्मात् न्यूना भवति तदा jvm प्रत्यक्षतया उच्चं 32-बिट् पतां निष्कासयिष्यति, अर्थात् न्यूनं वर्चुअल् पतास्थानं उपयुज्यते ।
5. यदा heap memory 32G इत्यस्मात् अधिका भवति तदा compression pointer अमान्यः भविष्यति तथा च 64-bit (अर्थात् 8 bytes) Java object इत्यस्य सम्बोधनार्थं बाध्यः भविष्यति एतेन 1 इत्यस्य समस्या उत्पद्यते, अतः न भवितुं श्रेयस्करम् 32G इत्यस्मात् अधिका राशस्मृतिः ।
अस्मिन् सन्दर्भे, JVM पलायनविश्लेषणमापदण्डं (-XX:+DoEscapeAnalysis) चालू कृत्वा वस्तुस्मृतिविनियोगस्थानं अनुकूलितुं शक्नोति, येन प्रथमं स्केलरप्रतिस्थापनद्वारा ढेरस्य उपरि आवंटनं भवति (Escape विश्लेषणं भवति) JDK7 इत्यस्य अनन्तरं पूर्वनिर्धारितरूपेण चालू अस्ति यदि भवान् इच्छति तर्हि पैरामीटर्स् इत्यस्य उपयोगेन निष्क्रियं कुर्वन्तु (-XX:-DoEscapeAnalysis) ।
स्केलर प्रतिस्थापनम् : यदा पलायनविश्लेषणद्वारा निर्धारितं भवति यत् वस्तु बाह्यरूपेण न अभिगम्यते तथा च वस्तु अधिकं विघटितुं शक्यते, तदा JVM वस्तुं न निर्मास्यति, अपितु वस्तु सदस्यचरानाम् अस्याः पद्धत्या प्रयुक्तानां अनेकसदस्यचरानाम् विघटनं करिष्यति तथा च तान् प्रतिस्थापयन्तु एते प्रतिस्थापनसदस्यचराः स्टैक् फ्रेम अथवा रजिस्टर् इत्यत्र स्थानं आवंटयन्ति, येन वस्तुनः कृते अपर्याप्तः स्मृतिविनियोगः नास्ति यतः तत्र विशालः सङ्गतः स्थानं नास्ति स्केलर प्रतिस्थापनमापदण्डान् (-XX:+EliminateAllocations) सक्षमं कुर्वन्तु, यत् JDK7 इत्यस्य अनन्तरं पूर्वनिर्धारितरूपेण सक्षमं भवति ।
स्केलरः समुच्चयमात्राः च : स्केलरः एकः परिमाणः अस्ति यस्य विघटनं न भवति, तथा च JAVA इत्यस्य मूलभूतः दत्तांशप्रकारः स्केलरः (यथा int, long इत्यादयः मूलभूताः दत्तांशप्रकाराः सन्दर्भप्रकाराः च इत्यादयः) is a quantity that can be further decomposed, and एतत् परिमाणं बहुलकीकरणमात्रा इति कथ्यते । जावा इत्यस्मिन् वस्तुनि समुच्चयः सन्ति येषां विघटनं अधिकं कर्तुं शक्यते ।
बृहत् वस्तुनि तानि वस्तुनि सन्ति येषु बृहत् परिमाणेन निरन्तरं स्मृतिस्थानं (यथा स्ट्रिंग्, एरे च) आवश्यकं भवति । JVM पैरामीटर् -XX:PretenureSizeThreshold बृहत् वस्तुनः आकारं सेट् कर्तुं शक्नोति यदि वस्तु सेट् आकारं अतिक्रमति तर्हि सः प्रत्यक्षतया पुरातनपीढीं प्रविशति तथा च युवा पीढीयां न प्रविशति एतत् पैरामीटर् केवलं द्वयोः संग्राहकयोः Serial तथा ParNew इत्येतयोः अन्तर्गतं मान्यम् अस्ति ।
उदाहरणार्थं, JVM पैरामीटर्स् सेट् कुर्वन्तु: -XX:PretenureSizeThreshold=1000000 (unit is bytes) -XX:+UseSerialGC यदि भवान् उपरि प्रथमं प्रोग्राम् निष्पादयति तर्हि भवान् पश्यति यत् बृहत् वस्तु प्रत्यक्षतया पुरातनपीढीयां प्रविशति ।
किमर्थं एवं भवितुमर्हति ?
बृहत्वस्तूनाम् स्मृतिविनियोगे प्रतिलिपिकरणक्रियाः परिहरितुं कार्यक्षमतां न्यूनीकर्तुं च ।
Survivor क्षेत्रे यत्र वस्तु वर्तमानकाले स्थापिता अस्ति (क्षेत्रेषु एकः, s क्षेत्रः यत्र वस्तु स्थापिता अस्ति), वस्तुनां समूहस्य कुल आकारः अस्य Survivor क्षेत्रस्य स्मृति आकारस्य (-XX) 50% अधिकः भवति :TargetSurvivorRatio निर्दिष्टुं शक्यते), ततः अस्मिन् समये एतत् अधिकं भवति यत् अस्य वस्तुनां समूहस्य अधिकतमवयोः समानाः वस्तुनः प्रत्यक्षतया वृद्धावस्थायां प्रवेशं कर्तुं शक्नुवन्ति उदाहरणार्थं, The आयुः 1 + आयुः 2 + आयुः n युक्तानां बहुविधवस्तूनाम् योगः Survivor क्षेत्रस्य 50% अधिकः अस्ति This अस्मिन् समये, आयुः n (समावेशी) अपि च ततः अधिकानि सर्वाणि वस्तूनि पुरातनपीढीयां स्थापितानि भविष्यन्ति। अयं नियमः वस्तुतः आशास्ति यत् ये वस्तूनि दीर्घकालं यावत् जीवितुं शक्नुवन्ति ते यथाशीघ्रं जरायुः प्रविशन्ति इति । वस्तुगतिकी आयुनिर्णयतन्त्रं सामान्यतया लघु gc इत्यस्य अनन्तरं प्रवर्तते ।
युवा पीढौ प्रत्येकं लघु gc इत्यस्मात् पूर्वं JVM पुरातनपीढीयां अवशिष्टं मुक्तस्थानं गणयिष्यति ।
यदि उपलब्धं स्थानं युवानां पीढीयां सर्वेषां विद्यमानवस्तूनाम् (कचरावस्तूनाम्) परिमाणानां योगात् न्यूनं भवति ।
इदं जाँचयिष्यति यत् "-XX:-HandlePromotionFailure" इति पैरामीटर् (jdk1.8 मध्ये पूर्वनिर्धारितरूपेण सेट् कृतः) सेट् कृतः अस्ति वा ।
यदि एषः पैरामीटर् उपस्थितः अस्ति तर्हि एतत् परीक्षयिष्यति यत् पुरातनपीढौ उपलब्धः स्मृति-आकारः प्रत्येकस्य पूर्व-लघु-gc-पश्चात् पुरातन-पीढीयां प्रविष्टानां वस्तूनाम् औसत-आकारात् अधिकः अस्ति वा इति
यदि पूर्वपदस्य परिणामः न्यूनः अस्ति अथवा पूर्वं उल्लिखिताः मापदण्डाः न सेट् भवन्ति, तर्हि Full gc उत्प्रेरितं भविष्यति, तथा च पुरातनपीढी युवा पीढी च एकत्र सङ्गृहीता भविष्यति यदि अद्यापि नूतनं संग्रहीतुं पर्याप्तं स्थानं नास्ति पुनःप्रयोगस्य अनन्तरं वस्तुषु "OOM" भविष्यति ।
अवश्यं, यदि लघु gc इत्यस्य अनन्तरं पुरातनपीढीयां स्थानान्तरणीयानां अवशिष्टानां वस्तूनाम् आकारः अद्यापि पुरातनपीढीयां उपलब्धस्थानात् बृहत्तरः अस्ति, तर्हि पूर्ण gc अपि पूर्ण gc इत्यस्य अनन्तरं प्रवर्तते is still no space for the surviving objects after the minor gc, इदमपि "OOM" भवति
tomcat इत्यस्य अनेकाः मुख्यवर्गभारकाः : १.
commonLoader: Tomcat इत्यस्य मूलभूततमं वर्गभारकं लोडिंग् मार्गे स्थितानि वर्गाणि Tomcat कंटेनरेण एव प्रत्येकेन Webapp द्वारा च अभिगन्तुं शक्यन्ते;
catalinaLoader: Tomcat पात्रस्य निजवर्गलोडरः लोडिंग् मार्गे वर्गाः Webapp कृते न दृश्यन्ते;
sharedLoader: प्रत्येकं Webapp द्वारा साझाकृतः वर्गलोडरः लोडिंग् मार्गे वर्गाः सर्वेषां Webapps कृते दृश्यन्ते, परन्तु Tomcat पात्रे न;
WebappClassLoader: प्रत्येकस्य Webapp इत्यस्य निजवर्गलोडरः लोडिंग् मार्गे स्थिताः वर्गाः केवलं वर्तमान Webapp कृते दृश्यन्ते, यथा युद्धसङ्कुलस्य मध्ये सम्बद्धवर्गान् लोड् करणं प्रत्येकस्य युद्धसङ्कुलस्य अनुप्रयोगस्य परस्परपृथक्करणं प्राप्तुं स्वकीयः WebappClassLoader भवति, यथा भिन्नयुद्धसंकुलम् अनुप्रयोगाः भिन्नाः वसन्तसंस्करणाः प्रवर्तन्ते येन कार्यान्वयनम् स्वस्ववसन्तसंस्करणं लोड् कर्तुं शक्नोति;