2012-11-30 12 views
9

में उपकरण का उपयोग करने का सबसे अच्छा तरीका this question के अनुसार, जावा में किसी ऑब्जेक्ट का मेमोरी आकार निर्धारित करने का मानक तरीका java.lang.instrumentation का उपयोग कर है। कुछ शोध के बाद, ऐसा लगता है कि इसे प्राप्त करने के लिए कोई स्कैला विशिष्ट तरीका नहीं है, इसलिए जावा दृष्टिकोण भी यहां लागू होना चाहिए।ऑब्जेक्ट का आकार निर्धारित करें: स्कैला/एसबीटी

दुर्भाग्यवश, जावा पृष्ठभूमि के बिना स्कैला प्रोग्रामर के लिए यह स्कैला में इस तकनीक को अनुकूलित करने के लिए पूरी तरह से सरल नहीं है। मेरे प्रश्न हैं:

प्रश्न 1

वास्तव में क्या यहाँ हो रहा है? मुझे लगता है कि हमें एक अलग जेएआर में ObjectSizeFetcher जैसी कक्षा क्यों डालना है, यह सुनिश्चित करना है कि यह वास्तविक कार्यक्रम से पहले लोड हो, जहां हम इसका उपयोग करना चाहते हैं। मुझे लगता है कि Premain-Class प्रविष्टि और पैरामीटर -javaagent:TheJarContainingObjectFetcher.jar के बिना उपकरण का उपयोग करना संभव नहीं है?

प्रश्न 2

वहाँ एसबीटी में पूरा कार्य प्रवाह को लागू करने के लिए एक सरल तरीका है? वर्तमान में मैं केवल कुछ ही बोझिल समाधान देखता हूं: मुझे पहले एक माध्यमिक एसबीटी परियोजना स्थापित करना है जहां मैं ObjectSizeFetcher परिभाषित करता हूं और इसे एक जार में पैकेज करता हूं। अब तक मुझे पता नहीं चला कि पैकेजिंग के दौरान JAR में Premain-Class प्रविष्टि को स्वचालित रूप से कैसे जोड़ना है, इसलिए मुझे इसे मैन्युअल रूप से हल करना होगा। मैं परिणामस्वरूप जेएआर को परियोजना के स्थानीय पुस्तकालयों में जोड़ सकता हूं जहां मैं getObjectSize का उपयोग करना चाहता हूं। इस परियोजना के लिए अब मुझे fork in run सक्षम करना होगा और javaOptions in run += "-javaagent:TheJarContainingObjectFetcher.jar" का उपयोग करना होगा। मौजूदा एसबीटी परियोजना के भीतर उपकरण का त्वरित उपयोग करने के लिए क्या एक और सरल (और कम घुसपैठ) कार्य प्रवाह है? शायद मैं इस माध्यमिक जार को अनावश्यक बनाने के लिए सीधे Premain-Class के बारे में एसबीटी बता सकता हूं?

प्रश्न 3

आप स्काला में एक वस्तु का स्मृति के उपयोग का मूल्यांकन करने के लिए एक पूरी तरह से अलग तरह से अनुशंसा करते हैं?

+1

में वस्तु लेआउट योजनाओं का विश्लेषण काश एक leaner रास्ता एसबीटी भीतर स्काला के लिए पूरा करने के लिए है कि वहाँ गया था यानी हो सकता है कंसोल आरपीएल .... – matanster

उत्तर

2

उत्तर 1: हाँ, यदि आप iinstrumentation चाहते हैं, तो आपको एक उदाहरण प्राप्त करने की आवश्यकता है। आप शायद Premain-Class और -javaagent के बिना इसे प्राप्त नहीं कर सकते हैं।

उत्तर 2: आप क्लासलोडर्स का उपयोग कर सकते हैं (और इसकी आवश्यकता हो सकती है) और एक बहुत ही सरल बूटस्ट्रैप प्रोजेक्ट (जावा में या प्रोगार्ड के साथ स्कैला में) बना सकते हैं। दो कारण हैं:

पहला कारण: सुविधा। आप मानक स्कैला लाइब्रेरी और अपनी प्रोजेक्ट की क्लास डायरेक्टरी को शामिल करने के लिए java.net.URLClassLoader का उपयोग कर सकते हैं। परीक्षण करते समय आपको JAR में इसे फिर से लोड करने की आवश्यकता नहीं होगी।

दूसरा कारण: जार नरक को रोकना। आप शायद जानते हैं कि स्कैला द्विआधारी संगत नहीं है। आपको यह भी पता होना चाहिए कि जावा एजेंट को उसी क्लासलोडर में एप्लिकेशन के साथ लोड किया गया है। यदि क्लासलोडर में स्कैला लाइब्रेरी शामिल है, तो एप्लिकेशन बस एक और स्कैला संस्करण का उपयोग नहीं कर सकता है।

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

उत्तर 3: मैं शायद उपकरण का भी उपयोग करता हूं।

2

उत्तर 3: आप जो JOL (Java Object Layout) प्रदर्शित करता है ktoso/sbt-jol को एक नज़र, JVMs

// project/plugins.sbt 
addSbtPlugin("pl.project13.sbt" % "sbt-jol" % pluginVersionHere) 

It does include the size: 

> jol:internals example.Entry 

... 
[info] example.Entry object internals: 
[info] OFFSET SIZE TYPE DESCRIPTION     VALUE 
[info]  0 12  (object header)    N/A 
[info]  12  4 int Entry.value     N/A 
[info]  16  4 String Entry.key      N/A 
[info]  20  4  (loss due to the next object alignment) 
[info] Instance size: 24 bytes 
[info] Space losses: 0 bytes internal + 4 bytes external = 4 bytes total 
संबंधित मुद्दे