2012-09-16 8 views
5

अगर मैं जावा में यह लिख:क्या जावा में 3 बाइट्स लेते हैं? कब: स्ट्रिंग एस = "एबीसी"; जावा

String s = "abc"; 

केवल स्मृति में 3 बाइट्स पर कब्जा रहा है?
यदि सही है, तो JVM स्ट्रिंग ऑब्जेक्ट का अंत कैसे पाता है?
क्या यह स्मृति में अधिक बाइट्स लेता है?

+2

'स्ट्रिंग' कक्षा के लिए स्रोत पढ़ें। – SLaks

+0

यदि आप स्ट्रिंग क्लास के लिए स्रोत पढ़ते हैं तो आप देखेंगे कि यह लंबाई को संग्रहीत करता है, यह यह है कि यह कैसे जानता है कि स्ट्रिंग कितनी देर तक है। बीटीडब्ल्यू "एबीसी" स्मृति के लगभग 48 बाइट्स का उपयोग करता है। –

उत्तर

7

यह अधिक से अधिक 3 बाइट्स लेता है, से this page

पूरी जानकारी के लिए पर पढ़ें कारणों से हम नीचे का पता लगाने देंगे, एक जावा स्ट्रिंग की न्यूनतम स्मृति उपयोग (हॉटस्पॉट जावा 6 वी एम में) है आम तौर पर के रूप में इस प्रकार है:

  • chara की संख्या गुणा:

    Minimum String memory usage (bytes) = 8 * (int) ((((no chars) * 2) + 45)/8) 
    

    या, दूसरे शब्दों में कहें दो से स्ट्रिंग के cters;

  • 38 जोड़ें;
  • यदि परिणाम 8 का एक बहु नहीं है, तो 8 के अगले एकाधिक तक गोल करें;
  • परिणाम आमतौर पर स्ट्रिंग द्वारा ढेर पर उठाए गए बाइट्स की न्यूनतम संख्या होती है।

एक ही वेबसाइट से This page भी तरीके हैं जिनसे आप से String

+0

38 जोड़ें? या 45 जोड़ें? – Al2O3

+1

38 जोड़ें। 45 को नीचे की ओर गोल करना है। सिद्धांत में –

1

न्यूनतम स्ट्रिंग स्मृति उपयोग (बाइट) = 8 * (int) ((((की संख्या कक्षाएं अलग का उपयोग कर स्मृति बचा सकता है का विवरण वर्ण) * 2) + 45)/8)

+0

यह उससे कम हो सकता है ... यदि आप खाते में स्ट्रिंग्स लेते हैं जो बैकिंग एरे साझा करते हैं। –

+0

यह कुछ और है, ओपी स्मृति उपयोग और एक स्ट्रिंग के बारे में पूछ रहा है। – awm

2

संक्षिप्त उत्तर: नहीं, लंबे शॉट से नहीं। जेवीएम तार काफी भारी होने के लिए जाने जाते हैं; ऑब्जेक्ट में न केवल वर्ण सरणी के लिए एक सूचक है बल्कि इसकी लंबाई भी है। और आंतरिक भंडारण यूटीएफ -16 कोडपॉइंट्स का उपयोग करता है, इसलिए आपका प्रश्न "क्या यह 6 बाइट्स ले सकता है?" :-)

JVM का तकनीकी संदर्भ आपको स्ट्रिंग ऑब्जेक्ट्स का सटीक आकार देगा। आप कुछ रोचक ब्लॉग पोस्ट such as this one और तकनीकी लेख भी पा सकते हैं।

स्ट्रिंग ऑब्जेक्ट्स के सटीक आकार के प्रश्न के लिए एक अच्छा सौदा है। हम ऑब्जेक्ट प्वाइंटर्स, स्ट्रिंग इंटर्निंग इत्यादि के संपीड़न में शामिल हो सकते हैं। यह भी तथ्य है कि स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए हम अक्सर स्ट्रिंग मेमोरी साझा करते हैं, जैसा कि आप उदाहरण के लिए substring पर कॉल करते हैं।

हालांकि, हमेशा सत्य क्या है: यह 3 बाइट से अधिक है।

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