2010-01-12 15 views
17

मैं कुछ लेख पढ़ लिए हैं, और मैं (कृपया मुझे सही करें और/या प्रश्न को संपादित करता है, तो मैं गलत हूँ) के बाद समझ में आया:पर्मजेन अंतरिक्ष क्यों बढ़ रहा है?

जावा ढेर इस तरह खंडित किया जाता है:

  • युवा पीढ़ी: ऑब्जेक्ट का निर्माण होगा कि यहाँ जाना है, इस हिस्से अक्सर और सस्ते में कचरा एकत्र

  • पुरानी पीढ़ी है: वस्तुओं कि युवा पीढ़ी के कचरा संग्रह जीवित रहने के यहाँ जाना है, इस क्षेत्र कचरा एकत्र कम बार और एक का उपयोग कर रहा है अधिक सीपीयू मांग प्रक्रिया/एल्गोरिदम (मुझे विश्वास है यह कहा जाता है निशान स्वीप)

संपादित करें: इस क्षेत्र में आपकी एप्लिकेशन कक्षाएं मेटाडाटा के भर जाता है और कई के रूप किसी अन्य उपयोगकर्ता द्वारा कहा गया है, PermGen क्षेत्र कहा जाता heap

  • PermGen का हिस्सा नहीं है अन्य चीजें जो अनुप्रयोग उपयोग पर निर्भर नहीं हैं।

तो, यह जानकर ... मेरा पर्मगैन स्थान बढ़ता है जब ऐप भारी भार में होता है? इस जगह से पहले मैंने जो कहा था, उसके लिए ऐप लोड के बावजूद वृद्धि नहीं होनी चाहिए, लेकिन जैसा कि मैंने शुरुआत में कहा था शायद मैं कुछ मान्यताओं के बारे में गलत हूं।

वास्तव में यदि पर्मजेन अंतरिक्ष बढ़ रहा है, तो क्या कचरा इकट्ठा करने या इसे रीसेट करने का कोई तरीका है?

+0

क्या आप आगे बढ़ सकते हैं कि आपके परम जीन बढ़ने पर क्या हो रहा है? आप कैसे देख रहे हैं कि आपकी परम जीन बढ़ रही है? –

उत्तर

19

दरअसल, सूर्य की जेवीएम स्थायी पीढ़ी (पर्मजेन) में ढेर से पूरी तरह से अलग है। क्या आप वाकई कार्यरत पीढ़ी को नहीं देख रहे हैं? अगर आपकी स्थायी पीढ़ी बढ़ती रहती है तो यह संदिग्ध होगा।

यदि आपका परम जीन लगातार बढ़ रहा है, तो यह खोदना मुश्किल क्षेत्र है। आम तौर पर यह तब बढ़ना चाहिए जब पहली बार नई कक्षाएं लोड की जाती हैं (और संभावित रूप से प्रतिबिंब के कुछ निश्चित उपयोग भी इसका कारण बन सकते हैं)। आंतरिक तारों को परम जीन में भी संग्रहीत किया जाता है।

आप सोलारिस पर होना है, तो आप -permstat jmap का उपयोग पर्म जनरल आँकड़े बाहर फेंक सकता है, लेकिन उस विकल्प विंडोज (और संभवत: अन्य प्लेटफार्मों) पर उपलब्ध हो प्रतीत नहीं होता है। यहाँ the documentation on jmap for Java 6

से है सूर्य की guide on JConsole (जो आप इन पूल के आकार देखने दूँगी): हॉटस्पॉट जावा वी एम, स्मृति धारावाहिक कचरा संग्रहण के लिए पूल अनुसरण कर रहे हैं के लिए

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

क्या आप क्लासलोडर श्रृंखला के साथ कुछ मज़ाकिया कर रहे हैं? क्या आप स्ट्रिंग्स के गुच्छा पर intern() पर कॉल कर रहे हैं?

+0

नहीं, ऐप का 'भारी भाग' एक बड़ा ऑब्जेक्ट ग्राफ़ deserializing में निहित है, लेकिन ग्राफ मुख्य रूप से अंदर स्ट्रिंग के साथ हैश मैप्स है। शायद वह 'इंटर्न' कह रहा है? –

+2

नहीं।हैश मैप इंटर्न() को कॉल नहीं करता है। भयानक लिंक के लिए –

0

जब आप क्लासलोडर में हेरफेर कर रहे हैं तो यह एक बहुत ही आम समस्या है। जब आप हाइबरनेट/cglib को फिर से तैनात कर रहे हैं तो यह जावा ईई ऐप्स में बहुत कुछ देखा जाता है। अधिक जानकारी के लिए बाहर की जाँच

http://opensource.atlassian.com/confluence/spring/display/DISC/Memory+leak+-+classloader+won%27t+let+go

6

सबसे सामान्य कारणों में मैंने देखा है इस प्रकार हैं:

  • कस्टम classloaders कि नए लोगों को लोड करने के बाद अप मुक्त बड़े वर्गों को ध्यान से नहीं है।
  • कक्षा एक आवेदन (प्रॉड से देव में आम) कई बार redeploying
  • प्रॉक्सी कक्षाएं, रनटाइम के दौरान कृत्रिम बनाई गई हैं जिनमें से भारी उपयोग के बाद PermGen में शेष। कई उदाहरणों के लिए एक एकल श्रेणी परिभाषा का पुन: उपयोग किया जा सकता है जब नई प्रॉक्सी कक्षाएं बनाना आसान है।
6

यह डीबग करने के लिए और अधिक परेशान करने वाली समस्याओं में से एक है। बढ़ते परमेजन उपयोग को देखकर आप कई कारण देख सकते हैं। यहां 2 लिंक दिए गए हैं जो मुझे यह समझने में बहुत उपयोगी हैं कि लीक कैसे होते हैं और साथ ही उन्हें जो भी कारण हो रहा है उसे ट्रैक करना।

http://frankkieviet.blogspot.com/2006/10/how-to-fix-dreaded-permgen-space.html

http://frankkieviet.blogspot.com/2006/10/classloader-leaks-dreaded-permgen-space.html

+0

+1। मैं पिछले हफ्ते में से एक में ठोकर खाई लेकिन बाद में लिंक खो दिया था। –

0

सबसे सामान्य कारणों में मैंने देखा है इस प्रकार हैं:

  1. जावा वर्गों
  2. लोड किए गए हैं
  3. JAXBContext.newInstance
  4. String.intern()
संबंधित मुद्दे