2011-12-02 7 views
8

मेरे पास जावा में एक bufferedImage है। मैं कैसे देख सकता हूं कि यह कितनी मेमोरी लेता है? अग्रिम धन्यवाद।जावा जावा में कितनी मेमोरी buffered छवि का उपयोग करें जांचें?

+0

जेडीके (जेआरई नहीं) के 'बिन' फ़ोल्डर में' JVisualVM' का उपयोग करें और अपनी जावा ऐप प्रक्रिया को संलग्न करें। इसका प्रोफाइलर अनुभाग ऐप में उपयोग की जाने वाली सभी कक्षाओं के स्मृति उपयोग को निकाल सकता है। –

उत्तर

12

आप निर्धारित कर सकते हैं कि कितने बाइट्स छवि डेटा अकेले इस का उपयोग कर लेता है:

DataBuffer buff = image.getRaster().getDataBuffer(); 
int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType())/8; 

छवि को ही रंग मॉडल और अन्य बहीखाता जानकारी के लिए थोड़ा और अधिक स्थान लेता है, लेकिन बड़ी छवियों के लिए, bytes प्रमुख कार्यकाल होगा।

+0

+1 निश्चित रूप से एक स्मार्ट दृष्टिकोण है। BufferedImage में अतिरिक्त ओवरहेड तुलनात्मक रूप से छोटा है, खासकर जब अधिकांश छवियां आजकल अनुक्रमित रंग मॉडल का उपयोग नहीं करती हैं (जो कि छवि में डेटा का एकमात्र संभावित रूप से बड़ा हिस्सा है, दुर्लभ मामलों में 256k तक हो सकता है)। – mikera

+0

आप अंत में 8 तक क्यों विभाजित करते हैं। क्या GetTataType() बिट्स में आकार वापस कर देता है? – klyngbaek

+0

@thehanseatic - बिल्कुल। [डेटाबफर] के लिए दस्तावेज़ों से (http://docs.oracle.com/javase/6/docs/api/java/awt/image/DataBuffer.html): _ "डेटा प्रकार के आकार (बिट्स में) देता है , डेटाटाइप टैग दिया गया। "_ –

0

मुझे यकीन नहीं है कि बाइट्स की संख्या के लिए 100% सटीकता के साथ इसे समझने के लिए एक सीधा-आगे तरीका है, इसे स्वयं की गणना किए बिना (रंग मॉडल, छवि का आकार, और अन्य घटक)।

You can calculate the totalMemory() and freeMemory() आवंटन से पहले और बाद में ढेर पर, और इस तरह का अनुमान लगाएं। यदि अन्य वस्तुओं को आपके चेक के बीच आवंटित (या एकत्रित) किया जाता है, तो आपकी गणना सटीक नहीं होगी।

This discussion जेवीएम में प्राचीन प्रकारों के आकार के बारे में बात करता है (एक वस्तु कई आदिम वस्तुओं का संग्रह है), जिसका उपयोग आप इसे समझने के लिए कर सकते हैं।

This article जावा में स्मृति उपयोग का एक सिंहावलोकन दें।

+0

मैं इसे स्वयं की गणना करने के लिए कैसे जाउंगा (रंग मॉडल और अन्य कारकों का मेम उपयोग?) धन्यवाद। – klyngbaek

+0

मैं दस्तावेज पढ़ने के द्वारा, गणना करने के मैन्युअल तरीके का संदर्भ दे रहा था, यह पता लगाने के लिए कि प्राइमेटिव्स ने आखिरकार किसी दिए गए चित्र को बनाया है, और फिर केवल मान जोड़ना है। – jefflunt

0

Runtime#totalMemory और Runtime#gc का उपयोग करके आपको बहुत नज़दीक अनुमान प्राप्त करने में सक्षम होना चाहिए। उदाहरण:

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc(); 
long totalUsed = Runtime.getRuntime().totalMemory(); 

BufferedImage image = ... 

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc(); 
totalUsed = Runtime.getRuntime().totalMemory() - total; 

कॉलिंग gc कई बार, संभावना है कि कचरा कलेक्टर वास्तव में चला जाएगा बढ़ जाती है के बाद से gc सिर्फ एक सुझाव है। इस उदाहरण में gc पर कॉल करना सुनिश्चित करता है कि एकत्रित नहीं होने वाली कोई भी वस्तु स्मृति उपयोग में जोड़ रही है।

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