2009-06-04 18 views
15

मैं एक इंस्टॉलर लिख रहा हूं जो उस विशेष हार्डवेयर के लिए उत्पाद की कॉन्फ़िगरेशन को ट्यून करेगा जिस पर इसे चलाया जाएगा। विशेष रूप से, मैं यह निर्धारित करना चाहता हूं कि सिस्टम में कितनी भौतिक रैम स्थापित है, इसलिए मैं अनुमान लगा सकता हूं कि उत्पाद चलाने के दौरान कितनी मेमोरी आवंटित की जाती है।मुझे जावा में भौतिक मेमोरी आकार कैसे मिल सकता है?

आदर्श रूप से, मैं इसे प्लेटफ़ॉर्म-स्वतंत्र, शुद्ध जावा तरीके से करना चाहता हूं, क्योंकि इंस्टॉलर को कई अलग-अलग प्लेटफ़ॉर्म पर चलने की आवश्यकता होगी, लेकिन यदि यह संभव नहीं है, तो विंडोज के लिए समाधान को प्राथमिकता दी जाती है यह सबसे आम तैनाती मंच है।

इस मामले में, यह मानना ​​सुरक्षित है कि उत्पाद बॉक्स पर चलने वाला एकमात्र/मुख्य एप्लीकेशन होगा, इसलिए मुझे किसी और को निचोड़ने की चिंता करने की आवश्यकता नहीं है। मैं इस अनुभव के रूप में अधिक आवंटित नहीं करना चाहता हूं, हमारे अनुभव में, प्रदर्शन को नुकसान पहुंचा सकता है।

+0

यदि आपका इंस्टॉलर जावा में है - यह केवल तभी काम करेगा जब जेआरई स्थापित किया गया हो ... – Nate

+0

धन्यवाद - इस मामले में, जेआरई सॉफ्टवेयर की सूचीबद्ध आवश्यकताओं में से एक है, इसलिए हमें लगता है कि हमें लगता है यह वहाँ है :) –

+0

जेएमएक्स के माध्यम से भी संभव नहीं है – dfa

उत्तर

3

विंडोज़ के लिए, आपको डब्लूएमआई तक पहुंचने की आवश्यकता होगी - यह आपको जा रहा है: Accessing Windows Management Instrumentation (WMI) from Java

आप डब्लूएमआई के इस खंड का उपयोग करना चाहेंगे: Win32_LogicalMemoryConfiguration।

ऐसा करने का शुद्ध जावा तरीका हो सकता है, लेकिन मुझे इससे अनजान है।

+0

धन्यवाद! ऐसा लगता है कि क्लास XP और Server 2003 में असमर्थित है, और Vista के बाद अनुपलब्ध है (http://msdn.microsoft.com/en-us/library/aa394181(VS.85).aspx)। जाहिर है Win32_OperatingSystem इसके प्रतिस्थापन है। –

+0

हाँ विंडोज़ के विभिन्न संस्करण विभिन्न डब्लूएमआई कक्षाओं का समर्थन करते हैं। आपको अपने लक्षित ओएस के आधार पर समायोजित करने की आवश्यकता होगी। – Nate

1

लिनक्स के तहत आप sysinfo(2) का उपयोग कर सकते हैं। मुझे नहीं लगता कि यह वास्तव में शुद्ध जावा से संभव है।

+0

चीयर्स - शायद मुझे जेएनआई के माध्यम से कॉल करना होगा? –

+0

हाँ वह सी syscall है। एक cmdline से आप परिणामों को मुक्त (1) से पार्स कर सकते हैं, मुझे पूरा यकीन है कि एक बेहतर तरीका भी है लेकिन अभी एक के बारे में नहीं सोच सकता। आप यह सब एक शेल स्क्रिप्ट या पैकेज में रख सकते हैं जो उपयोगकर्ता जेनी का उपयोग करने के बजाय भी आपके एप्लिकेशन को इंस्टॉल करने के लिए उपयोग करते हैं। – wds

4

यदि आपका इरादा सभी उपलब्ध भौतिक मेमोरी का उपयोग करने के लिए जेवीएम के लिए मेमोरी सेटिंग्स को ट्यून करना है, लेकिन अधिक नहीं है, तो आप -XX: + AggressiveHeap पैरामीटर पर एक नज़र डाल सकते हैं।

इसके साथ, आपको उपलब्ध स्मृति को जानने की आवश्यकता नहीं है। JVM स्वचालित रूप से इसके पैरामीटर स्केल करेगा।

17

आप भौतिक स्मृति क्वेरी करने के लिए निम्नलिखित जावा कोड का उपयोग कर सकते हैं:

com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) 
    java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
long physicalMemorySize = os.getTotalPhysicalMemorySize(); 

लेकिन पैकेज com.sun.management वैकल्पिक है और हर मंच पर उपलब्ध नहीं हो की जरूरत है।

+1

आईएमएचओ, यह अब तक का सबसे अच्छा जवाब है। लिनक्स के साथ ही खिड़कियों पर काम किया। विंडोज़ के लिए डब्लूएमआई के साथ विशेष उपचार की आवश्यकता नहीं है ... –

+2

ध्यान दें कि 32 बिट जेवीएम का उपयोग करते समय यह 4 जीबी से अधिक नहीं लौटाएगा। – berry120

+0

धन्यवाद, अच्छा। यही मुझे चाहिए। मैं सी ++ वर्कअराउंड बनाने जा रहा था और इसे अपने जावा प्रोग्राम से कॉल कर रहा था। –

3

स्थानीय जेएमएक्स और एमबीन के बारे में क्या? इसे आज़माएं:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize"); 
System.out.println("Total memory: "+ attribute.toString() +" B"); 

आप इस तरह से कई उपयोगी जानकारी तक पहुंच सकते हैं।

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