2016-07-24 10 views
7

मैं सिर्फ यह जानना चाहता था कि जावावीएम (सूर्य, लिनक्स) का वास्तविक पदचिह्न क्या है जब कोई JVMs की कई प्रक्रियाओं को शुरू करना शुरू कर देता है। जब मुझे अच्छी तरह याद है तो उन्हें rt.jar (और शायद परे?) साझा करना चाहिए। क्या वे जेवीएम जेआईटी कैश साझा करते हैं (सभी जेवीएम एक ही क्लासपाथ की सुविधा देते हैं)?जेवीएम की मेमोरी पदचिह्न क्या है और मैं इसे कम कैसे कर सकता हूं?

क्या ऐसा कुछ भी है जो मैं बहु-उदाहरण JVM के ओवरहेड को कम करने के लिए कर सकता हूं? (ढेर के लिए छोटी सीमा निर्धारित करने के बगल में)?

एप्लिकेशन प्रोग्रामिंग करते समय मैं कुछ भी कर सकता हूं?

क्या मैं मेमोरी क्षेत्रों को साझा कर सकता हूं? शायद मैप किए गए मेमोरी ब्लॉक साझा करें?

+1

क्यों आप एक से अधिक JVMs अंडे देने के लिए की जरूरत है? ऐसे कारण हैं कि कोई ऐसा क्यों करना चाहेगा, लेकिन आपके कारण क्या हैं? –

+0

यदि आप एकाधिक जेवीएम का उपयोग कर रहे हैं, तो यह एक अच्छे कारण के लिए होगा और प्रत्येक जेवीएम की मेमोरी ओवरहेड आपके द्वारा चल रही मशीन की तुलना में काफी छोटी होनी चाहिए। –

+0

सरल रखो, विकास के दौरान मेरे पास एक ही प्रक्रिया में कुछ भी होगा। तैनाती के दौरान मुझे आश्चर्य है कि क्या मैं सादगी के बजाय स्थिरता में सहायता के लिए विभिन्न प्रक्रियाओं में कई अलग-अलग हिस्सों को रख सकता हूं। आपको एक उदाहरण देने के लिए। यदि आप लिनक्स पर हाल ही में क्रोम संस्करण + सेलेनियम लाते हैं तो बाधाएं लगभग 25: 1 होती हैं कि प्रक्रियाएं फंस जाती हैं और आप लॉक हो जाते हैं। इसे अपनी प्रक्रिया में रखकर, क्रोम प्रक्रिया को मारना अगर यह बहुत लंबा लगता है, तो जवाब है। एक अन्य परिदृश्य सी ++ कोड चला रहा है, इसे अपनी प्रक्रिया में अलग करने से आपके JVM को गलती पर क्रैश नहीं होता है और यदि आप ऐसा करते हैं तो आप इसे पुनरारंभ कर सकते हैं। –

उत्तर

3

शायद यह केवल आंशिक उत्तर होगा।

क्या JVM

एक जावा अनुप्रयोग से भरा पदचिह्न ढेर अंतरिक्ष और गैर ढेर अंतरिक्ष के होते हैं की स्मृति पदचिह्न है (मुझे इसे इस तरह से संपर्क कर सकें)। नॉन-हीप स्पेस में जो कुछ भी रहता है, उसके कुछ उदाहरण: पर्मजेन या मेटास्पेस, कोड (मॉलोक) से आवंटन सही करते हैं, एनआईओ मूल मेमरी का भी उपयोग करता है।

मैं इसे कैसे कम कर सकता हूं?

ढेर आमतौर पर आपके पदचिह्न का सबसे बड़ा हिस्सा है। तो, मैं इसके साथ शुरू करूंगा।

गैर-ढेर स्थान के लिए, आप कम कर सकते हैं: PermGen (यदि आप अधिकतम आकार अनावश्यक है), थ्रेड स्टैक्स (वे काफी बड़े हैं, खासकर 64-बिट जेएमएम में) और कोड कैश (प्रदर्शन का इंस्टॉलेशन, पाठ्यक्रम)।

उन JVM JIT कैश

सामान्य परिस्थितियों में हिस्सा करता है (और मैं दूसरों के बारे में पता नहीं कर रहा हूँ) हर प्रक्रिया का अपना पदचिह्न है। वास्तव में यह एक थ्रेड से एक प्रक्रिया को अलग करता है। और कई जेवीएम पर वापस, प्रत्येक जेवीएम एक अलग प्रक्रिया है।

rt.jar साझा करना चाहिए

आप एक ही निर्देशिका (समान स्थापना) से जावा शुरू करते हैं, निश्चित रूप से, वे एक ही rt.jar का हिस्सा है, लेकिन केवल कक्षाओं का एक स्रोत के रूप में । उदाहरण के लिए, स्ट्रिंग क्लास को कई बार चल रहे JVMs के रूप में लोड किया जाएगा।

5

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

हॉटस्पॉट के उदाहरण जेएमवी डेटा साझा करने के लिए एक-दूसरे से संवाद नहीं करते हैं । मूल रूप से वे ओएस द्वारा साझा की गई चीज़ों को छोड़कर कुछ भी साझा नहीं करते हैं, यानी गतिशील पुस्तकालय (.so) और केवल-पढ़ने वाली मेमोरी-मैप की गई फ़ाइलें (.jars)।

आईपीसी तंत्र के माध्यम से आगे साझा करने के लिए यह एप्लिकेशन पर निर्भर है, उदाहरण के लिए स्मृति-मैप की गई फ़ाइलें।

+0

मैंने इसे देखा और इसे कक्षा डेटा साझाकरण कहा जाता है: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/class-data-sharing.html यह बताता है कि यह डेटा लोड करता है कक्षाओं को संसाधित करें और इसे तेज़ लोड अप के लिए साझा करें। अंत में यह वही नहीं है जो मैंने मूल रूप से आशा की थी। लेकिन यह फ़ाइल एक्सेस ओएस कैश से अलग है। –

+1

@ मार्टिनकेर्स्टन राइट। सीडीएस जेवीएम पोर्स के एड्रेस स्पेस में प्रीलोडेड क्लासेस को मैप करने के लिए एक तंत्र है। सीडीएस छवि को जेवीएम के बीच स्मृति-मैप की गई फ़ाइल के रूप में साझा किया जाता है। हालांकि मैं कहूंगा कि यह पदचिह्न को कम करने के बजाय स्टार्ट-अप समय को कम करने के बारे में अधिक है। – apangin

2

अन्य उत्तर की मदद के लिए यहाँ है ठेठ JVM स्मृति पदचिह्न मूल्यों और तरीके उन्हें मापने के लिए लिस्टिंग व्यावहारिक लेख के एक जोड़े:

https://spring.io/blog/2015/12/10/spring-boot-memory-performance

http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/

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