2014-09-01 14 views
5

मेरी मेमोरी में डेट ऑब्जेक्ट का आकार प्रभावी रूप से कैसे निर्धारित करें?जावा 'तिथि' ऑब्जेक्ट आकार

शुरू में मैं इस link जो एक तारीख वस्तु के लिए के बारे में 9 बाइट्स बात करती माध्यम से चला गया ..

मैं जब मैं इस लिंक है, जहां इसके बारे में 32 बाइट्स में बात करती है पाया यह पता लगाने के लिए कोशिश कर रहा था !!! ! स्मृति में दिनांक वस्तु के लिए

Date Object Size in Memory

कृपया मदद करते हैं।

इन पंक्तियों पर विचार करने का कारण: मैं कुछ गणना के लिए स्मृति में लाखों वस्तुओं को स्मृति में लोड कर रहा हूं। उस वर्ग में चरों में से एक दिनांक वस्तु है। मैं मान को लंबे समय तक स्टोर कर सकता हूं, लेकिन कोड में मामूली क्विर्क की आवश्यकता होगी। मैं मेमोरी पदचिह्न को कम से कम मूल्य पर रखने पर विचार कर रहा हूं। ऐसा करने के लिए, मुझे प्रत्येक मामले में कॉल करने के लिए सटीक स्मृति आवश्यकताओं को जानने की आवश्यकता है।

+6

शायद आपके द्वारा जारी की जाने वाली समस्या को समझाएं जिसके लिए आपको देखभाल करने की आवश्यकता है? – John3136

+2

ढेर अंतरिक्ष में खपत! = क्रमबद्ध आकार, http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java – jdphenix

+0

@ जॉन3136 वही जोड़ा गया। धन्यवाद। – LPD

उत्तर

2

आपका पहला लिंक आकार के बारे में बात कर रहा है जब धारावाहिक, आप स्मृति में आकार के बारे में बात कर रहे हैं। यही कारण है कि आकार अलग हैं।

आपके लिंक के अनुसार, सहेजे गए लंबे समय के लिए 9 बाइट्स सीरियलाइज्ड।

स्मृति में, आपके दूसरे लिंक के अनुसार, लंबी और अन्य वस्तुओं के लिए 32 बाइट्स जो आपको तिथि के साथ काम करने की अनुमति देते हैं।

0

यह आपके कार्यान्वयन पर निर्भर करता है, आप इसके साथ क्या करना चाहते हैं और आप आकार को कैसे परिभाषित और मापते हैं। उदाहरण के लिए,

public static void main(String[] args) { 
    Date d = new Date(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    try (ObjectOutputStream oos = new ObjectOutputStream(baos);) { 
     oos.writeObject(d); 
     oos.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    byte[] written = baos.toByteArray(); 
    System.out.println(written.length); 
} 

आउटपुट

46 
यहाँ

संपादित

आदिम कम स्मृति तो long हमेशा का उपयोग करेगा किसी भी वस्तु का प्रकार (Date शामिल है) का उपयोग करना। यह मूल रूप से जावा में प्राइमेटिव क्यों शामिल है। अंत में, Calendar के उदाहरण का उपयोग करके और मानों को long के रूप में रखते हुए आपको अपने कोड परिवर्तन को कम करने के लिए लचीलापन देना चाहिए।

2

इस प्रश्न का उत्तर देने का सबसे आसान तरीका java.util.Date के स्रोत कोड को देखना है।

private transient long fastTime; 
private transient BaseCalendar.Date cdate; 

long 8 बाइट्स और cdate एक वस्तु संदर्भ जो 4 बाइट्स का एक आकार है की स्मृति के आकार की है:

यह केवल 2 गैर स्थिर क्षेत्र (जावा 1.7.0_55) है। तो कुल 12 बाइट

तो cdate instantiated किया जाएगा, यह स्मृति में अतिरिक्त बाइट्स की आवश्यकता होती है सकते हैं, लेकिन अगर आप कंस्ट्रक्टर्स पर भी लग रहे हैं, कभी कभी तो यह और भी छुआ नहीं किया जाएगा, और अन्य लोगों में यह null के अंत में एड हो जाएगा कन्स्ट्रक्टर, इसलिए अंतिम परिणाम भी 12 बाइट्स है।

यह सिर्फ Date बनाने के लिए है। यदि आप Date (उदाहरण के लिए Date.toString()) पर विधियों को कॉल करते हैं, तो किसी ऑब्जेक्ट को cdate फ़ील्ड में बना और स्टोर करेगा जिसे साफ़ नहीं किया जाएगा। इसलिए यदि आप Date पर कुछ विधियों को कॉल करते हैं, तो इसका मेमोरी उपयोग बढ़ जाएगा।

नोट: ऑब्जेक्ट संदर्भ 64-बिट JVMs पर 64 बिट लंबा हो सकता है, जिसमें स्मृति उपयोग 16 बाइट्स होगा।

नोट # 2: यह भी ध्यान दें कि यह केवल Date ऑब्जेक्ट का स्मृति उपयोग है। सबसे अधिक संभावना है कि आप कहीं भी अपना संदर्भ संग्रहीत करेंगे, उदा। किसी अन्य श्रेणी में किसी सरणी या सूची या फ़ील्ड में अतिरिक्त 4 बाइट्स (या 64 बिट जेवीएम पर 8 बाइट्स) की आवश्यकता होगी।

+0

जावा स्रोत का कौन सा संस्करण आप देख रहे थे? –

+0

@ लुइगी मैन्डोज़ा जावा 1.7.0_55। – icza

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