2015-09-29 9 views
13

मैं स्ट्रिंग deduplication (more info) के लिए जावा 8 अद्यतन 20 में सुविधा के बारे में पढ़ रहा हूँ, लेकिन मुझे यकीन नहीं है कि यह मूल रूप से String.intern() अप्रचलित बनाता है।जावा 8 स्ट्रिंग deduplication बनाम String.intern()

मुझे पता है कि इस जेवीएम सुविधा को जी 1 कचरा कलेक्टर की आवश्यकता है, जो कि कई लोगों के लिए एक विकल्प नहीं हो सकता है, लेकिन मानते हैं कि कोई जी 1 जीसी, का उपयोग कर रहा है, क्या JVM बनाम स्वचालित समर्पण का कोई अंतर/लाभ/नुकसान है मैन्युअल रूप से intern आपके तार (एक स्पष्ट व्यक्ति intern() पर कॉल के साथ अपने कोड को प्रदूषित नहीं करने का लाभ है)?

यह विशेष रूप से विचार कर रहा है जो कि Oracle G1GC इस सुविधा के साथ जावा 9

+3

[सुझाए गए वीडियो] (https://www.youtube.com/watch?v=YgGAUGC9ksk) - लेकिन वैसे भी, निष्कर्ष हमेशा एक ही है: आप। चाहिए। नहीं। देखभाल। – fge

+0

क्षमा करें, क्या परवाह नहीं करना चाहिए? किसके बारे में उपयोग करना है (जिसका अर्थ है वे समकक्ष हैं) या नई सुविधा के बारे में (जिसका अर्थ यह उपयोगी नहीं है) ?? – Hilikus

+2

मतलब: केवल दूसरे स्ट्रिंग के बिना 'स्ट्रिंग' कक्षा का उपयोग करें। – fge

उत्तर

6

में डिफ़ॉल्ट जीसी कर सकता है, यदि आप एक ही सामग्री "abc" 1000 विशिष्ट स्ट्रिंग वस्तुओं, सभी है, JVM उन्हें एक ही साझा कर सकता है दिलचस्प है आंतरिक रूप से char[]। हालांकि, आपके पास अभी भी 1000 विशिष्ट String ऑब्जेक्ट्स हैं।

intern() के साथ, आपके पास केवल एक String ऑब्जेक्ट होगा। तो अगर स्मृति की बचत आपकी चिंता है, intern() बेहतर होगा। यह अंतरिक्ष, साथ ही साथ जीसी समय बचाएगा।

हालांकि, intern() का प्रदर्शन इतना अच्छा नहीं है, पिछली बार मैंने सुना था। ConcurrentHashMap का उपयोग करके भी आप अपना स्वयं का स्ट्रिंग कैश रखते हुए बेहतर हो सकते हैं ... लेकिन आपको यह सुनिश्चित करने के लिए इसे बेंचमार्क करना होगा।

+0

क्या आप किसी अन्य अंतर के बारे में जानते हैं? – Hilikus

+3

असल में, String.intern के साथ प्रदर्शन मैन्युअल स्ट्रिंग पूलिंग के साथ तुलनीय है। मिखाइल वोरोंटोव ने कुछ प्रदर्शन बेंचमार्क किए और दिखाया कि स्ट्रिंगटेबल साइज पैरामीटर के साथ एक प्राइम के लिए पर्याप्त रूप से उच्च सेट किया गया है, यह प्रदर्शन मैन्युअल स्ट्रिंग को स्वयं पूलिंग करने के लिए तुलनीय था। [http://java-performance.info/string-intern-in-java-6-7-8/](http://java-performance.info/string-intern-in-java-6-7-8 /) –

2

मैं लक्षित दर्शकों के बारे में एक और निर्णय कारक लागू करने के लिए करना चाहते हैं:

  • एक प्रणाली उन पुस्तकालयों आंतरिक विकास को प्रभावित करने के लिए कम क्षमता के साथ एक प्रणाली कई अलग अलग पुस्तकालयों/चौखटे द्वारा रचित, होने एकीकरण के लिए, StringDeDuplication हो सकता है अगर स्मृति एक समस्या है तो एक त्वरित विजेता। यह JVM में सभी स्ट्रिंग्स को प्रभावित करेगा, लेकिन जी 1 इसे करने के लिए केवल अतिरिक्त समय का उपयोग करेगा। जब आप किसी अन्य पैरामीटर (स्ट्रिंगडेडप्लिकेशनएज थ्रेसहोल्ड)
  • का उपयोग करके गणना की जाती है तो आप भी ट्विक कर सकते हैं डेवलपर के लिए अपना कोड प्रोफाइलिंग करने के लिए, String.intern अधिक दिलचस्प हो सकता है। डोमेन मॉडल की विचारशील समीक्षा यह तय करने के लिए आवश्यक है कि इंटर्न को कॉल करना है या नहीं। अंगूठे के नियम के रूप में आप इंटर्न का उपयोग कर सकते हैं जब आप जानते हैं कि स्ट्रिंग में मूल्यों का सीमित सेट होगा, जैसे कि एक प्रकार का गणित सेट (यानी देश का नाम, महीना, सप्ताह का दिन ...)।
4

टिप्पणी संदर्भ के रूप में, देखें: http://java-performance.info/string-intern-in-java-6-7-8/। यह बहुत अंतर्दृष्टिपूर्ण संदर्भ है और मैंने बहुत कुछ सीखा, हालांकि मुझे यकीन नहीं है कि इसके निष्कर्ष जरूरी हैं कि "एक आकार सभी फिट बैठता है"। प्रत्येक पहलू आपके अपने आवेदन की जरूरतों पर निर्भर करता है - यथार्थवादी इनपुट डेटा के माप को अत्यधिक अनुशंसा की जाती है!

मुख्य कारक है शायद पर निर्भर करता है कि आप क्या पर नियंत्रण में हैं:

  • आप जी सी की पसंद पर पूरा नियंत्रण है? उदाहरण के लिए जीयूआई आवेदन में, सीरियल जीसी का उपयोग करने के लिए अभी भी एक मजबूत मामला बनना है। (प्रक्रिया के लिए बहुत कम स्मृति मेमोरी पदचिह्न - एक साधारण जटिल ऐप के लिए 400 एमबी बनाम ~ 1 जीबी सोचें, और उपयोग में एक क्षणिक स्पाइक के बाद, अधिक इच्छुक रिलीज मेमोरी होने के नाते)। तो आप इसे चुन सकते हैं या अपने उपयोगकर्ताओं को विकल्प दे सकते हैं। (यदि ढेर छोटा रहता है तो विराम एक बड़ा सौदा नहीं होना चाहिए)।

  • क्या आपके पास कोड पर पूरा नियंत्रण है?जी 1 जीसी विकल्प तीसरे पक्ष के पुस्तकालयों (और एप्लिकेशन!) के लिए बहुत अच्छा है जिसे आप संपादित नहीं कर सकते हैं।

दूसरा विचार (@ Zhongyu के जवाब के अनुसार) है कि String.intern डी-डुप्लीकेशन कर सकते हैं String खुद को वस्तुओं, जबकि G1GC जरूरी केवल डी-डुप्लिकेट कर सकते हैं उनके निजी char[] क्षेत्र है।

एक तीसरा विचार CPU उपयोग हो सकता है, कहें कि लैपटॉप बैटरी जीवन पर असर आपके उपयोगकर्ताओं के लिए चिंता का विषय हो सकता है। जी 1 जीसी ढेर को डुप्लिकेट करने के लिए समर्पित अतिरिक्त थ्रेड चलाएगा। उदाहरण के लिए, मैंने ग्रहण चलाने के लिए इसके साथ खेला और पाया कि यह शुरू होने के बाद बढ़ी हुई सीपीयू गतिविधि की प्रारंभिक अवधि (1 - 2 मिनट सोचें) लेकिन यह एक छोटे ढेर पर "उपयोग में" बस गया और कोई स्पष्ट नहीं (केवल आंख- टास्क मैनेजर को गेंदबाजी करना) उसके बाद सीपीयू ओवरहेड या धीमा-डाउन। तो मुझे लगता है कि एक सीपीयू कोर का एक निश्चित% उच्च स्मृति-मंथन की अवधि डी-डुप्लिकेशन (दौरान? के बाद) पर लिया जाएगा। (बेशक वहाँ एक तुलनीय भूमि के ऊपर जो होगा भी धारावाहिक में चलता है, लेकिन फिर हो सकता है अगर आप String.intern हर जगह फोन, ...)

आप शायद हर जगह स्ट्रिंग डी-डुप्लीकेशन जरूरत नहीं है।

  • वास्तव में लंबी अवधि के ढेर के उपयोग, और
  • डुप्लिकेट तार

की एक उच्च अनुपात बनाने String.intern चुनिंदा, अन्य भागों का उपयोग करके प्रभाव: वहाँ शायद कोड के केवल कुछ क्षेत्रों है कि कर रहे हैं कोड (जो अस्थायी या अर्द्ध अस्थायी तार बना सकता है) कीमत का भुगतान नहीं करते हैं।

और अंत में, अमरूद उपयोगिता के लिए एक त्वरित प्लग: Interner है, जो:

अन्य अपरिवर्तनीय प्रकार

तुम भी उपयोग कर सकते हैं कि तार के लिए के लिए String.intern() के बराबर व्यवहार प्रदान करता है। मेमोरी शायद आपकी शीर्ष प्रदर्शन चिंता (और होनी चाहिए), इसलिए शायद यह अक्सर लागू नहीं होता है: हालांकि जब आपको कुछ हॉट-स्पॉट क्षेत्र से गति की हर बूंद को निचोड़ने की आवश्यकता होती है, तो मेरा अनुभव यह है कि जावा-आधारित कमजोर संदर्भ हैश मैप समाधान जेवीएम विकल्पों को ट्यून करने के बाद भी String.intern() के जेवीएम के सी ++ कार्यान्वयन से थोड़ा तेज लेकिन लगातार तेज़ दौड़ते हैं। (और बोनस: आपको विभिन्न इनपुट में स्केल करने के लिए JVM विकल्पों को ट्यून करने की आवश्यकता नहीं है।)

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