कैसे धीमी गति से पहली कॉल से बचने के लिए जावा कक्षाओं को गर्म करें?


13

मैं एक प्रोजेक्ट कर रहा हूं जहां मुझे 1s से कम लेने के लिए सभी API कॉल की आवश्यकता है, लेकिन मैं प्रत्येक रूट के लिए पहली कॉल के साथ एक समस्या का सामना कर रहा हूं जो निम्नलिखित लोगों की तुलना में धीमी है।

वर्तमान में / लॉगइन करने के लिए पहला कॉल 3.6s लेता है और अगले वाले सभी अन्य मार्गों के लिए 170ms और समान लेते हैं।

मुझे पता चला -XX:+TraceClassLoadingकि पहली कॉल पर, कक्षाओं को मेमोरी में लोड किया गया था और इसके कारण प्रदर्शन समस्या हुई।

हालाँकि मुझे स्टार्ट अप में सभी कक्षाओं को लोड करने का एक आसान तरीका नहीं मिला और प्रत्येक नई सेवा के लिए, मुझे ApplicationRunner में वार्म अप कॉल जोड़ने की आवश्यकता है।

क्या किसी के पास स्प्रिंगबूट एप्लिकेशन की कक्षाओं को स्वचालित रूप से लोड करने या इसके सभी मार्गों को गर्म करने का कोई समाधान है?


क्या आप अधिक विवरण जोड़ सकते हैं? क्या आपका एप्लिकेशन कन्ट्रोल करने वाला है? या आप अन्य सेवाओं को बुला रहे हैं? आप अन्य सेवाओं पर कॉल कैसे कर रहे हैं?
मेनिओस

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

अप्रत्यक्ष दृष्टिकोण का एक सा: यदि आपके पास उन समापन बिंदुओं के लिए 100% यूनिट परीक्षण कवरेज है जो आप उनका उपयोग कर सकते हैं। तुम अब भी अंत बिंदु प्रति कोड करने के लिए होता है, लेकिन आप कुछ हासिल
Marged

1
आपके द्वारा किए जा रहे प्रोजेक्ट के आधार पर आदर्श नहीं हो सकता है, लेकिन जब आपका एप्लिकेशन लोड किया जाता है तो आप आंतरिक रूप से अपने समापन बिंदु को कॉल कर सकते हैं।
omoshiroiii

@omoshiroiii इसमें कुछ भी गलत नहीं है। हम ऐसा करते हैं। उत्पादन में। इसका कारण कुछ गतिशील पुस्तकालयों का उपयोग करना है invokedynamicऔर हम जानते हैं कि संकल्प उन लोगों के लिए पहली कॉल पर धीमा है (हमारे पास ऐसी हजारों कॉल हैं, जो इस पहली कॉल के बिना दसियों सेकंड तक जमा होती हैं)।
यूजीन

जवाबों:


1

जावा का क्लास लोडिंग आलसी है। इसका मतलब है कि एक वर्ग को केवल JVM द्वारा लोड किया जाता है जब उसे जरूरत होती है और यदि उसे इसकी आवश्यकता होती है।

यदि आप इसे उत्सुकता से उन कक्षाओं को लोड करने के लिए मजबूर करना चाहते हैं, जिन्हें आपको केवल उन्हें संदर्भित करने की आवश्यकता है। इसे करने का एक तरीका यह है कि जार सामग्री या वर्ग फ़ाइलों के माध्यम से कक्षा के नाम प्राप्त करने के लिए पुनरावृति करें और फिर उन्हें कॉल करने के लिए उपयोग करें Class.forName(className)

इसके अतिरिक्त, यदि स्टार्टअप समय और प्रदर्शन आपके उपयोग के मामले के लिए बहुत महत्वपूर्ण है, तो आप समय संकलन समाधानों जैसे कि ग्रेवालवीएम , या संकलन के लिए जेआईटी की सीमा को कम करना चाहते हैं -XX:CompileThreshold


उनमें से कोई भी ओपी की समस्या का समाधान नहीं करेगा। GraalVM में लोडिंग अभी भी आलसी है और वास्तव JITमें पहले इनवोकेशन पर अर्थहीन है ।
यूजीन

यह भी GraalVMअच्छा है, लेकिन कृपया इसे github में दिए गए मुद्दों की संख्या पर एक नज़र डालें: जैसे ही आप सैंडबॉक्स प्रोजेक्ट से कुछ बड़ा करते हैं (मैं आपको प्रतिबिंब देख रहा हूं, मुख्य रूप से), आप कुछ दर्द में होंगे, कम से कम। मेरी बात यह है: ग्रेवलवीएम के लिए स्वैपिंग उंगलियों की एक सरल तस्वीर नहीं है।
यूजीन

मैंने जार में कक्षाएं लोड करने के बारे में सोचा लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिला, क्या आपके पास एक उदाहरण होगा?
यबरी

@ यूजीन यदि आप मेरा उत्तर पढ़ते हैं तो आप देखेंगे कि मैंने ग्रेवालम या जेआईटी थ्रेशोल्ड में यह नहीं कहा है कि क्लास लोडिंग की आलसीता बदल जाएगी। आलसीपन के संबंध में ओपी के प्रश्न का उत्तर उस से पहले का पैराग्राफ है। अंतिम पैराग्राफ केवल एक अतिरिक्त टिप है अगर ओपी को क्लास लोडिंग से परे स्टार्टअप समय / प्रदर्शन का अनुकूलन करने की आवश्यकता होती है।
andresp

1
@ वायब्री के उत्तर के साथ अन्य प्रश्न हैं, जैसे, stackoverflow.com/questions/2370867/…
andresp

0

मेरे लिए, आपके पास एकमात्र व्यवहार्य विकल्प है class data sharing, जो JEP 310 , JEP 341 और JEP 350 में फैला है , लेकिन इसके लिए java-13 की सबसे अधिक आवश्यकता है। हम इसे आंतरिक रूप से मेरे कार्य स्थल पर परीक्षण कर रहे हैं (ज्यादातर मज़े के लिए, झूठ नहीं बोलना) और परिणाम अभी तक अच्छे लग रहे हैं।

दूसरा विकल्प आवेदन शुरू होने पर आपके समापन बिंदु को बुला रहा है - यदि वह विकल्प है। फिर, यह है उदाहरण के लिए हमारे लिए: हम कोड को गर्म करने के सैकड़ों बार के एक जोड़े डमी डेटा के साथ उन्हें कहते हैं। लेकिन, एक ही समय में, हमारे पास ऐसी सेवाएं हैं जहां यह असंभव होगा - यही कारण है कि खोज CDSभी।


अपने उत्पादन डेटाबेस में डेटा के निर्माण से बचने के लिए आप प्रमाणीकरण और पोस्ट एंडपॉइंट को कैसे संभालते हैं?
यबरी

@ यब्री ने कहा कि मैंने कुछ के लिए असंभव क्यों कहा ।
यूजीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.