2012-03-21 9 views
10

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

मेरे वर्तमान योजना एक स्क्रिप्ट उत्पन्न करने के लिए prefix(1..n).java उन्हें संकलन लिखने के लिए है और फिर क्यू चलाने पर:

for(int i=1 ; i < n ; i ++){ 
    Class.forName("com.mypackage.prefix"+i); 
} 

वहाँ इस लक्ष्य को हासिल करने के लिए एक और अधिक सुरुचिपूर्ण समाधान है?

+0

मुझे लगता है कि यदि आप एक नया classloader का दृष्टांत और अधिक से अधिक एक ही कक्षा लोड करते हैं, यह विभिन्न वर्गों की टन बनाने के लिए आवश्यकता के बिना अपने लक्ष्य तक पहुंच जाएगा। वैकल्पिक रूप से, मुझे लगता है कि String.intern() भी आपके PermGen स्पेस को –

+0

@Guillaume भर सकता है: यह एक उत्तर है, टिप्पणी नहीं! –

+0

@ टॉम, हाँ और नहीं क्योंकि मुझे इस बारे में निश्चित नहीं है, इसलिए यह एक सुझाव है। मैं इस पर सकारात्मक दिखना नहीं चाहता हूं। ;-) –

उत्तर

10

ठीक है, ऐसा लगता है जैसे String.intern() चाल करेगा। यहां एक कार्यान्वयन मिला है। क्रेडिट के साथ-साथ गैरेथ को जाता है:

public static void main(String[] args) throws ClassNotFoundException { 
    int i = 0; 
    StringBuilder sb = new StringBuilder("a"); 
    for (i = 0; i < 20; i++) { 
     sb.append(sb.toString()); 
    } 
    System.err.println(sb.length()); 
    i = 0; 
    Set<String> strings = new HashSet<String>(); 
    while (true) { 
     strings.add(sb.append(i++).toString().intern()); 
     System.err.println(i); 
    } 
} 
+0

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

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