2011-01-14 9 views
31

JVM के स्टार्टअप समय गति बढ़ाने के लिए खुद आवेदन वर्गों जोड़कर, सूर्य डेवलपर्स फैसला किया कि यह एक अच्छा विचार JVM की स्थापना के दौरान एक मंच के लिए मानक क्रम कक्षाएं precompile है। इन precompiled कक्षाओं को पाया जा सकता है उदा। पर:स्पीड अप आवेदन शुरू classes.jsa को

$ JAVA_HOME \ JRE \ बिन \ ग्राहक \ classes.jsa

मेरी कंपनी वर्तमान में एक जावा अनुप्रयोग जो अपनी ही JRE लाता है विकसित करता है, तो यह समय शुरू हमारे आवेदन तेजी लाने के लिए एक शानदार विकल्प होगा इस जेएसए फ़ाइल में भी अपनी खुद की एप्लिकेशन कक्षाएं जोड़कर।

मैं नहीं मानता अर्जी फ़ाइल जादू द्वारा बनाया गया था, तो कैसे यह बनाई गई है? और मैं अपने स्वयं के वर्गों को शामिल करने के लिए जेवीएम कैसे चाल सकता हूं?

संपादित: मैं पहले से ही निम्नलिखित पता चला:

classes.jsa आदेश

java -Xshare:dump 

द्वारा बनाई गई है वर्गों डंप में शामिल करने के लिए की सूची $JAVA_HOME/jre/lib/classlist में पाया जा सकता।

मैं भी यहाँ मेरे अपने वर्गों को जोड़ने के लिए (और उन्हें जावा उन्हें खोजने के लिए के लिए rt.jar में जोड़ने के लिए), और classlist फ़ाइल नीचे अपने ही checksum उत्पन्न करने में कामयाब रहे।

अंतिम समस्या है: अगर मैं उनके मूल पैकेज में एक ही कक्षाएं छोड़ संकुल जावा, com.sun, और org.w3c में केवल कक्षाएं, मान्यता प्राप्त हो रहे हैं, वे लोड नहीं किया जाएगा। मैंने इस बारे में पॉइंटर के लिए पूरे ओपनजेडीके स्रोत की खोज की, लेकिन ऐसा लगता है कि सुरक्षा डोमेन के साथ कुछ करना है। अगर कोई इस विषय में पर्याप्त दिलचस्पी लेता है और पर्याप्त जानकारी देता है, तो कृपया मेरे लिए investigaete आगे कुछ पॉइंटर्स जोड़ें।

+0

आप साझा कर सकते हैं कि कैसे आप चेकसम पुनर्गणना? – coppit

+2

मुझे एम्बेडेड जावा के लिए एक स्लाइड डेक में मेरा जवाब मिला - ओपनजेड स्रोत पेड़ में AddJsum नामक एक उपयोगिता है। http://www.oracle.com/technetwork/jp/ondemand/java/20110519-java-a-1-greg-400531-ja.pdf – coppit

+0

धन्यवाद, जब मैं समय प्राप्त करता हूं तो मैं इसे आजमा सकता हूं। – Daniel

उत्तर

8

जावा 8u40 (और एम्बेडेड जावा 8u51) के रूप में, जावा अब एप्लिकेशन क्लास डेटा शेयरिंग (एपीसीडीएस) (यानी साझा संग्रह में आपकी कक्षाएं) का समर्थन करता है। हमारे एम्बेडेड जावा पर, हमने 40% का स्टार्टअप सुधार पाया है! सुंदर हमारी ओर से लगभग कोई काम के लिए भयानक ...

https://blogs.oracle.com/thejavatutorials/entry/jdk_8u40_released

+0

शानदार! मैं इसे तुरंत पढ़ना शुरू कर दूंगा :)! – Daniel

+0

बिल्कुल वही जो मैं चाहता था। अफसोस की बात यह है कि यह केवल एक वाणिज्यिक सुविधा के रूप में उपलब्ध है। लेकिन कम से कम ऐसा लगता है कि काम करता है। – Daniel

+0

अफसोस की बात है, ओरेकल ने संस्करण 8u51 के लिए एंबेडेड के लिए केवल एपीसीडीएस सुविधा रखी है ... हम ओरेकल से वापस आने पर/अगर कोई भाग्य नहीं आएंगे, तो इसका उत्तर पाने का प्रयास कर रहे हैं ... लेकिन कोई भाग्य नहीं है। हमें "वाह - हमारे उत्पाद टीम के बारे में आपके अनुभव को जानना अच्छा लगेगा" के बारे में आधा जवाब मिला, लेकिन फिर हमें उनके साथ संपर्क में रहने के बारे में कोई प्रतिक्रिया नहीं मिली। – Ben

8

दिलचस्प विचार। जैसा कि मैंने इसे पढ़ा है, इसका उपयोग वीएम में डेटा साझा करने और वर्गीकरण को तेज करने के लिए किया जाता है, संकलन नहीं। मुझे यकीन नहीं है कि आपको कितना बढ़ावा मिलेगा, लेकिन अगर आपके पास स्टार्टअप पर पहले से ही एक बड़ा अंतराल है (हालांकि वीएम पहले से ही इसे कम करने की कोशिश करता है) तो यह कोशिश करने लायक हो सकता है।

यह अपने आप कोशिश कर के रूप में, यह प्रतीत होता है जब सूर्य वी एम स्थापित किया गया है इस फ़ाइल को सामान्य रूप से बनाई गई है, लेकिन आप भी इसे नियंत्रित कर सकते हैं। कुछ विवरण इस पुराने सन जावा 5 Class Data Sharing दस्तावेज़ में हैं (जो आप पहले ही देख चुके हैं?)। कुछ सन जावा 6 डॉक्स भी mention it a few times, लेकिन दस्तावेज़ीकरण में ज्यादा कुछ नहीं जोड़ते हैं। ऐसा लगता है कि यह मूल रूप से IBM VM feature था। और, लिंक डंप जारी रखने के लिए, यह थोड़ा in this article समझाया गया है।

मैं व्यक्तिगत रूप से इसके बारे में ज्यादा पता नहीं है, इसलिए मैं नहीं जानता कि कैसे आप इसे नियंत्रित कर सकते हैं। आप इसे पुन: उत्पन्न कर सकते हैं, लेकिन मुझे नहीं लगता कि यह आपके लिए कस्टम सामान डालने का इरादा रखता है। इसके अलावा, भले ही आप इसे "चाल" कर सकें, शायद यह किसी प्रकार के सूर्य/ओरेकल लाइसेंस का उल्लंघन करेगा (उदाहरण के लिए आप rt.jar के साथ गड़बड़ नहीं कर सकते हैं और पुनर्वितरण कर सकते हैं)। और, जो कुछ भी कहा गया, मुझे संदेह है कि स्टार्टअप समय में आपको गंभीर सुधार दिखाई देगा जब तक कि आपके ऐप में हजारों या हजारों कक्षाएं न हों?

(और यह वास्तव में एक जवाब नहीं है, मुझे पता है, लेकिन यह एक टिप्पणी में दृष्टि से बहुत बड़ा था, और मैं सवाल रोचक लगा तो मैं थोड़ा की जांच की और किसी को भी एक ही जानकारी पाता है मामले में यहां दिए गए लिंक डाल उपयोगी।)

+0

+1 आपके महान प्रयास के लिए बहुत बहुत धन्यवाद। मैं आपके लिंक के माध्यम से पढ़ूंगा और आशा करता हूं कि एक कामकाजी समाधान के साथ वापस आऊंगा। इसके अलावा मुझे नहीं पता था कि मुझे rt.jar के साथ परेशान करने की अनुमति नहीं थी और इसे फिर से वितरित करने की अनुमति नहीं थी, लेकिन मुझे इसकी परवाह नहीं है, क्योंकि इसका उपयोग करने वाला एकमात्र ऐप मेरा होगा। – Daniel

+0

@ चार्ली, आपका दूसरा लिंक नीचे है ....... – Pacerier

11

आपने लगभग थे, तो आप केवल यह काम करने के लिए एक दो कदम की जरूरत है। ग्राहकों को अपनी कक्षाएं जोड़ने के लिए।js आप निम्न चरणों की आवश्यकता है:

  1. योग्य नाम अपनी कक्षाओं (तुम्हारे पास है)

  2. इन कक्षाओं की classpath (तुम्हारे पास है)

  3. पता चेकसम पुनर्गणना के लिए कैसे (आपके पास यह है)

  4. नई फाइल को डंप करें, कक्षाओं के क्लासपाथ प्रदान करते हुए अब आप जावा कक्षाओं के साथ प्रीकंपलिंग कर रहे हैं।

  5. कार्यक्रम चलाएं, एक ही classpath है कि आप नए classes.jsa

डंप करने के लिए classpath जहां कक्षाएं आप classlist को जोड़ रहे हैं कर रहे हैं प्रदान करने के लिए प्रयोग किया जाता है प्रदान करने, -Xbootclasspath/a आदेश का उपयोग करें। यह निर्देशिकाओं/JAR को जोड़ देगा जब JVM उन स्थानों को खोज रहा है जहां बूट कक्षाएं हैं। Class.jsa के लिए डिफ़ॉल्ट स्थान काफी छोटा है, अगर आपको इसे सुधारने की आवश्यकता है तो आप -XX:SharedReadWriteSize और -XX:SharedReadOnlySize आदेशों का उपयोग कर सकते हैं। आपका डंप कमांड आपको कुछ ऐसा दिखाई:

java -Xshare:dump -Xbootclasspath/a:C:/myfiles/directoryA/;C:/myfiles/directoryB/;C:/myJars/myJar.jar; 

अंतिम चरण बस, सामान्य रूप से जावा आवेदन चलाया जाता है शेयर मोड पर बारी की rememebering। जैसा कि आपने डंप पर जोड़ा था, आपको Xbootclasspath उत्साहजनक रूप से जोड़ने की भी आवश्यकता है। यह कुछ ऐसा दिखाई देगा:

java myapp.java -Xshare:on -Xbootclasspath/a:C:/myfiles/directoryA/;C:/myfiles/directoryB/;C:/myJars/myJar.jar; 

अब हर वर्ग है कि आप classlist पर डाल एक ही JVM में चल रहे अन्य मामलों के साथ साझा किया जा रहा है।

+0

बहुत अच्छा लगता है। मैं निश्चित रूप से यह जांच करूँगा! – Daniel

+0

मैं इसे आजमा रहा हूं और असफल रहा हूं। मैंने एक नई क्लासफ़ाइल फ़ाइल बनाई है और चेकसम जोड़ा है, और निर्दिष्ट -Xbootclasspath/a:/path/to/jars/*। परिणामस्वरूप class.jsa फ़ाइल मूल के समान आकार है। क्या यह संभव है कि डैनियल ने सुझाव दिया, -Xshare: डंप केवल विशिष्ट पैकेजों से कक्षाओं को डंप करेगा? इस कारण में मुझे रूचि है कि हम अपने तीसरे पक्ष के libs का उपयोग करते हैं जो हमारे आरएसएस मेमोरी उपयोग को फहरा रहे हैं।यह मानक पुस्तकालय की तरह JVMs के बीच साझा करना अच्छा लगेगा। (और हाँ, मैंने जुड़े प्रश्नों में सावधानी बरतनी है।)) – coppit

+0

क्या आप 'संशोधित' फ़ाइल को अपने संशोधित संस्करण के साथ बदल रहे हैं? –

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