2013-11-04 7 views
9

मेरे पास जावा में एक ऑब्जेक्ट है जिसमें एक स्ट्रिंग है। मैं उत्सुक हूं कि स्ट्रिंग का मेमोरी उपयोग कैसे काम करता है। मैं अपने कार्यक्रम के लिए मेमोरी उपयोग को अनुकूलित करने की कोशिश कर रहा हूं और एप्लिकेशन में लगभग 10000 ऐसी ऑब्जेक्ट्स होंगी। एक स्ट्रिंग के लिए जैसे "हैलो वर्ल्ड" मेमोरी उपयोग क्या होगा?जावा में स्ट्रिंग का मेमोरी उपयोग

+2

http://stackoverflow.com/questions/9699071/what-is-the-javas-internal-represention-for-string-modified-utf-8-utf-16 – jdevelop

+0

"हैलो वर्ल्ड" के लिए स्मृति उपयोग है एन्कोडिंग के आधार पर शायद 11 या 22 बाइट्स। हालांकि, यदि आपके पास कई स्थानों पर एक ही स्ट्रिंग है तो वे एक ही वस्तु हो सकती हैं और आप केवल संदर्भ के लिए स्मृति खर्च करते हैं। – Cruncher

+1

@ क्रंचर: जावा में "एन्कोडिंग के आधार पर" कोई नहीं है। आंतरिक रूप से सभी जावा स्ट्रिंग ऑब्जेक्ट्स को यूटीएफ -16 (या उसके कुछ संस्करण) के रूप में संग्रहीत किया जाता है। –

उत्तर

9

जावा प्रति वर्ण दो बाइट्स * का उपयोग करता है, इसलिए आपको किसी न किसी अनुमान के लिए पात्रों की संख्या को गुणा करने की आवश्यकता होगी। "पेलोड" के भंडारण के अतिरिक्त, आपको अपनी स्ट्रिंग के संदर्भ में आवंटित स्थान के लिए खाते की आवश्यकता होगी, जो आमतौर पर आपके लक्षित आर्किटेक्चर पर एक सूचक के आकार के बराबर होती है, स्ट्रिंग की लंबाई के लिए स्थान, जो एक int है, और कैश हैश कोड के लिए जगह है, जो एक और int है।

चूंकि, "Hello World" 11 वर्ण लंबा है, तो मैं इसका आकार 32-बिट पॉइंटर्स वाले कंप्यूटर पर 2 * 11 + 4 + 4 + 4 = 34 बाइट्स के रूप में अनुमानित करता हूं, या 2 * 11 + 8 + 4 + 4 = 38 64-बिट पॉइंटर्स वाले कंप्यूटर पर बाइट्स।

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


* -XX:+UseCompressedStrings विकल्प का उपयोग तब तक किया जाता है, जिस स्थिति में स्ट्रिंग्स को यूटीएफ -16 यूटीएफ -8 एन्कोडिंग की आवश्यकता नहीं होती है।

+4

आंतरिक तारों (String.intern) और उनके लिए पूल के बारे में मत भूलना। मैं 'स्ट्रिंग एस =" हाय "घोषित कर सकता हूं; 'प्रत्येक कक्षा में, लेकिन यह सभी मामलों में साझा किया जाएगा, इसलिए यह एक्स उदाहरण समय s.length() नहीं है। यह मोटे तौर पर 4 + उदाहरण सूचक आकार * उदाहरण है। – MadConan

+0

@MadConan यह एक उचित अवलोकन है, टिप्पणी के लिए धन्यवाद! – dasblinkenlight

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