2012-03-16 15 views
9

मैं अपने रूममेट के कंप्यूटर पर पूरे सप्ताहांत के लिए आनुवंशिक एल्गोरिदम चला रहा हूं, और मुझे डर है कि यह इतनी लंबी दौड़ में स्मृति से बाहर हो सकता है। हालांकि, मेरा एल्गोरिदम इस तरह से काम करता है जो कम उपयोगी परिणामों को ट्रिम करने के लिए उचित रूप से आसान बना देगा, इसलिए यदि कोई प्रोग्राम थाप स्पेस से बाहर निकलने के बारे में बताने का कोई तरीका था, तो मैं शायद कमरे बना सकता था और जा रहा था कुछ और समयक्या जावा प्रोग्राम यह पता लगा सकता है कि यह ढेर स्पेस पर कम चल रहा है?

वहाँ एक रास्ता सूचना भेजता है जब JVM ढेर स्थान से बाहर चल रहा है, OutOfMemoryError से पहले है?

+0

संभावित डुप्लिकेट [जावा ढेर आकार की गतिशील रूप से निगरानी कैसे करें?] (Http://stackoverflow.com/questions/2163228/how-to- गतिशील- मॉनिटर- जावा-heap-size) –

+0

@Andreas_D, यह प्रश्न व्यवहार करता है कार्यक्रम को बाहरी रूप से निगरानी के बारे में। मैं अपने स्वयं के कार्यक्रम को प्रतिक्रिया देना चाहता हूं जब यह ढेर अंतरिक्ष से बाहर निकलने वाला है। – zneak

+0

अन्य प्रश्नों के उत्तर में आंतरिक और बाहरी निगरानी समाधान शामिल हैं। –

उत्तर

6

आप एक javax.management.NotificationListener जब एक निश्चित सीमा से मारा जाता है कहा जाता है कि रजिस्टर कर सकते हैं।

तरह

final MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); 
final NotificationEmitter ne = (NotificationEmitter) memBean; 

ne.addNotificationListener(listener, null, null); 

final List<MemoryPoolMXBean> memPools = ManagementFactory 
    .getMemoryPoolMXBeans(); 
for (final MemoryPoolMXBean mp : memPools) { 
    if (mp.isUsageThresholdSupported()) { 
    final MemoryUsage mu = mp.getUsage(); 
    final long max = mu.getMax(); 
    final long alert = (max * threshold)/100; 
    mp.setUsageThreshold(alert); 

    } 
} 

कहाँ श्रोता NotificationListener का अपना स्वयं का कार्यान्वयन है कुछ।

+0

यह वही दिखता है जो मैं चाहता हूं। मै उसे करने की एक कोशिश तो करूंगा। – zneak

+0

यदि आप एक उदाहरण चाहते हैं तो मैं http://code.google.com/p/pitestrunner/ में इस दृष्टिकोण का उपयोग करता हूं। MemoryWatchdog क्लास के लिए देखें और इसका उपयोग MutationTestSlave द्वारा किया जाता है। – henry

+0

सदस्यता लेने पर फ़िल्टर जोड़ने के लिए मत भूलना, यानी: अधिसूचना फ़िल्टर फ़िल्टर = x -> MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED.equals (x.getType()); ne.addNotificationListener (tryPreventOom, फ़िल्टर, शून्य); –

3

आप इस आजमा सकते हैं:

// Get current size of heap in bytes 
long heapSize = Runtime.getRuntime().totalMemory(); 

// Get maximum size of heap in bytes. The heap cannot grow beyond this size. 
// Any attempt will result in an OutOfMemoryException. 
long heapMaxSize = Runtime.getRuntime().maxMemory(); 

// Get amount of free memory within the heap in bytes. This size will increase 
// after garbage collection and decrease as new objects are created. 
long heapFreeSize = Runtime.getRuntime().freeMemory(); 

यहां पाया के रूप में - http://www.exampledepot.com/egs/java.lang/GetHeapSize.html

+0

मैं इस एक ठीक हैक के लिए कर सकता है लगता है, लेकिन मैं नहीं बल्कि स्वचालित रूप से एक निश्चित सीमा से, पूरा किया जाता है बल्कि एक दिए गए अंतराल (आईओएस पर स्मृति अधिसूचना की तरह थोड़े) पर स्मृति स्थिति मतदान पर की तुलना में सूचित कर दिया था। – zneak

+0

मुझे किसी दिए गए थ्रेसहोल्ड के आधार पर स्वचालित रूप से अधिसूचित होने के किसी अन्य तरीके से अवगत नहीं है जब तक आप पृष्ठभूमि में ऐसा करने के लिए स्वयं को परामर्शदाता नहीं लिखते। – Nikhil

1

बस discardable परिणामों के लिए WeakReferences उपयोग करते हैं, तो वे स्थान कारणों से यदि आवश्यक हो तो छोड़ दिए जाएंगे।

+0

मैं इसे जीसी के विवेकाधिकार में नहीं छोड़ सकता, क्योंकि मुझे निर्णय लेने से पहले वस्तुओं की समीक्षा करने की आवश्यकता है। – zneak

+0

+1: या सॉफ़्ट रेफरेंस का उपयोग करें जो लंबे समय तक रहते हैं, वीक रेफरेंस को हमेशा जीसी पर छोड़ दिया जाता है। आप ऑब्जेक्ट को अधिसूचित करने के लिए संदर्भक्यूयू रख सकते हैं जिसे साफ़ किया जा सकता है। –

0

मैं इस बारे में निश्चित नहीं हूँ, लेकिन उद्देश्य हल नहीं कर सकते हैं ?? JConsole

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