2012-09-03 19 views
9

मुझे अपने जावा प्रोग्राम में संदर्भ के लिए लाखों एक्स/वाई डबल जोड़े स्टोर करना होगा। मैं मेमोरी खपत को यथासंभव कम से कम ऑब्जेक्ट संदर्भों की संख्या रखना चाहता हूं।जावा क्लास बनाम सरणी मेमोरी आकार?

double[] node = new double[2]; 
node[0] = x; 
node[1] = y; 

मैं सरणी का उपयोग कर वर्ग और मेरी एक्स और के बीच की कड़ी रोका जा सके लगा: तो कुछ सोच रहा एक छोटे से डबल सरणी में दो अंक पकड़े एक अच्छा विचार हो सकता है फैसला किया के बाद, यह सेटअप लग रहा है तो तरह है

class Node { 
    public double x, y; 
} 

हालांकि जिस तरह से में पढ़ने के बाद कक्षाओं में सार्वजनिक क्षेत्रों जमा हो जाती है, यह मुझ पर लगा कि खेतों वास्तव में संरचनाओं की तरह सूचक के रूप में संरचित नहीं किया जा सकता है, शायद JVM जाता है: इस प्रकार Y चरों, एक वर्ग में इस्तेमाल किया बस इन मानों को संगत स्मृति में संग्रहीत करना और जानता है कि बिना किसी पते के उन्हें कैसे ढूंढें, इस प्रकार मेरे बिंदु के वर्ग का प्रतिनिधित्व करना सरणी से छोटा है।

तो सवाल यह है कि, जिसमें एक छोटी स्मृति पदचिह्न है? और क्यों?

मुझे विशेष रूप से रुचि है कि कक्षा फ़ील्ड एक सूचक का उपयोग करते हैं या नहीं, और इस प्रकार 32-बिट ओवरहेड है, या नहीं।

उत्तर

5

बाद वाले में छोटे पदचिह्न हैं।

प्राथमिक प्रकार युक्त कक्षा में इनलाइन संग्रहित होते हैं। तो आपके Node में एक ऑब्जेक्ट हेडर और दो 64-बिट स्लॉट की आवश्यकता है। आपके द्वारा निर्दिष्ट सरणी एक सरणी हेडर (> = ऑब्जेक्ट हेडर) दो 64-बिट स्लॉट का उपयोग करती है।

यदि आप इस तरह से 100 चर आवंटित करने जा रहे हैं, तो इससे कोई फर्क नहीं पड़ता, क्योंकि यह केवल हेडर आकार अलग है।

चेतावनी: यह सब कुछ सट्टा है क्योंकि आपने JVM निर्दिष्ट नहीं किया है - इनमें से कुछ विवरण JVM द्वारा भिन्न हो सकते हैं।

+0

वर्तमान में मैक ओएस एक्स पर 64 में जावा 1.7 एसई चल अब मैं यह सोचते हैं रहा है कि एक विशाल 2 डी सरणी पूरी तरह से प्रत्येक नोड के लिए आवश्यक वस्तु संदर्भ को खत्म करेगा, इस प्रकार है कि जाने के लिए अब तक का सबसे स्मृति रूढ़िवादी जिस तरह से हो सकता है? –

+0

यदि 2 डी द्वारा आपका मतलब डबल [2] [एन] या डबल [एन] [2] है, जो ऑब्जेक्ट संदर्भों का भी नेतृत्व करेगा। के बाद से जावा में सरणियों सही मायने में इस मामले –

+0

में सरणियों के सरणियों हैं कम से कम स्मृति पदचिह्न एक 1-डी सरणी जहां अनुक्रमित स्पष्ट रूप से गणना होगा (आप * रास्ता * इस overoptimizing, लेकिन ... हैं)। जावा में 2 डी सरणी सिर्फ 1 डी सरणी के पॉइंटर्स की एक सरणी हैं। –

0

मुझे नहीं लगता कि आपकी सबसे बड़ी समस्या डेटा संग्रहित करने जा रही है, मुझे लगता है कि यह इसे पुनर्प्राप्त करने, अनुक्रमणित करने और छेड़छाड़ करने जा रहा है।

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

0

सबसे पहले, यह कहा जाना चाहिए कि वास्तविक स्थान उपयोग आपके द्वारा उपयोग किए जा रहे JVM पर निर्भर करता है। यह कड़ाई से कार्यान्वयन विशिष्ट है। निम्नलिखित एक सामान्य मुख्यधारा JVM के लिए है।

तो सवाल यह है कि, जिसमें एक छोटी स्मृति पदचिह्न है? और क्यों?

दूसरा संस्करण छोटा है। किसी सरणी में ऑब्जेक्ट हेडर में 32 बिट फ़ील्ड का ओवरहेड होता है जिसमें सरणी की लंबाई होती है। गैर-सरणी वस्तु के मामले में, आकार कक्षा में निहित है और इसे अलग से प्रदर्शित करने की आवश्यकता नहीं है।

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

एक जावा 2 डी सरणी वास्तव में और 1 डी सरणी (इत्यादि) की सरणी है, इसलिए आप उच्च आयाम वाले सरणी में समान विश्लेषण लागू कर सकते हैं।किसी भी आयाम में सरणी का आकार बड़ा होता है, ओवरहेड पर कम प्रभाव पड़ता है। 2x10 सरणी में ओवरहेड 10x2 सरणी से कम होगा। (पूरी तरह विचार करें ... लंबाई का 1 सरणी 2 + लंबाई 10 के 2 बनाम लंबाई की 1 सरणी 10 + 10 लंबाई 2. की भूमि के ऊपर सरणियों की संख्या के लिए आनुपातिक है।)

मैं एम विशेष रूप से रुचि रखते हैं कि वर्ग फ़ील्ड एक सूचक का उपयोग करते हैं या नहीं, और इस प्रकार 32-बिट ओवरहेड है, या नहीं।

(आप वास्तव में उदाहरण के मैदान, वर्ग क्षेत्रों नहीं के बारे में बात कर रहे हैं। इन क्षेत्रों static नहीं हैं ...)

फील्ड्स जिसका प्रकार एक आदिम प्रकार के बिना वस्तु के ढेर नोड में सीधे जमा हो जाती है है कोई संदर्भ इस मामले में कोई सूचक ओवरहेड नहीं है।

हालांकि, अगर फ़ील्ड प्रकार आवरण प्रकार (उदा Double बजाय double) थे तो एक संदर्भ के ऊपरी और Double वस्तु के लिए वस्तु हेडर के ऊपरी खर्च हो सकता है।

+0

यह मेरे मूल प्रश्न को बहुत अच्छी तरह से साफ़ करता है, धन्यवाद! –

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