त्रुटि java.lang.OutOfMemoryError: जीसी ओवरहेड सीमा पार हो गई




garbage-collection out-of-memory (9)

मुझे यह त्रुटि संदेश मिलता है क्योंकि मैं अपने जुनीट परीक्षण निष्पादित करता हूं:

java.lang.OutOfMemoryError: GC overhead limit exceeded

मुझे पता है कि OutOfMemoryError क्या है, लेकिन जीसी ओवरहेड सीमा का क्या अर्थ है? इसे कैसे हल किया जा सकता है?


अपने build.gradle (मॉड्यूल: ऐप) फ़ाइल में javaMaxHeapsize बढ़ाएं

dexOptions {
    javaMaxHeapSize "1g"
}

करने के लिए (इस लाइन को क्रम में जोड़ें)

 dexOptions {
        javaMaxHeapSize "4g"
    }

आपको Jdeveloper में स्मृति आकार को बढ़ाने की आवश्यकता है DomainEnv.cmd पर जाएं

set WLS_HOME=%WL_HOME%\server    
set XMS_SUN_64BIT=**256**
set XMS_SUN_32BIT=**256**
set XMX_SUN_64BIT=**3072**
set XMX_SUN_32BIT=**3072**
set XMS_JROCKIT_64BIT=**256**
set XMS_JROCKIT_32BIT=**256**
set XMX_JROCKIT_64BIT=**1024**
set XMX_JROCKIT_32BIT=**1024**

if "%JAVA_VENDOR%"=="Sun" (
    set WLS_MEM_ARGS_64BIT=**-Xms256m -Xmx512m**
    set WLS_MEM_ARGS_32BIT=**-Xms256m -Xmx512m**
) else (
    set WLS_MEM_ARGS_64BIT=**-Xms512m -Xmx512m**
    set WLS_MEM_ARGS_32BIT=**-Xms512m -Xmx512m**
)

तथा

set MEM_PERM_SIZE_64BIT=-XX:PermSize=**256m**
set MEM_PERM_SIZE_32BIT=-XX:PermSize=**256m**

if "%JAVA_USE_64BIT%"=="true" (
    set MEM_PERM_SIZE=%MEM_PERM_SIZE_64BIT%
) else (
    set MEM_PERM_SIZE=%MEM_PERM_SIZE_32BIT%
)

set MEM_MAX_PERM_SIZE_64BIT=-XX:MaxPermSize=**1024m**
set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=**1024m**

इस संदेश का अर्थ है कि किसी कारण से कचरा कलेक्टर अत्यधिक मात्रा में ले रहा है (डिफ़ॉल्ट रूप से प्रक्रिया के सभी CPU समय का 98%) और प्रत्येक रन में बहुत कम स्मृति (डिफ़ॉल्ट रूप से ढेर के 2%) को पुनः प्राप्त करता है।

इसका प्रभावी अर्थ यह है कि आपका प्रोग्राम किसी भी प्रगति को रोकता है और हर समय केवल कचरा संग्रह चलाने में व्यस्त रहता है।

अपने आवेदन को कुछ भी किए बिना सीपीयू समय को भिगोने से रोकने के लिए, JVM इस Error फेंकता है ताकि आपको समस्या का निदान करने का मौका मिले।

दुर्लभ मामलों जहां मैंने यह देखा है वह यह है कि कुछ कोड पहले से ही बहुत मेमोरी-बाधित वातावरण में कई अस्थायी वस्तुओं और कमजोर-संदर्भित वस्तुओं को बना रहा था।

विवरण के लिए इस लेख को देखें (विशेष रूप से यह हिस्सा )।


इसे इस्तेमाल करे

build.gradle फ़ाइल खोलें

  android {
        dexOptions {
           javaMaxHeapSize = "4g"
        }
   }

निम्नलिखित मेरे लिए काम किया। बस निम्नलिखित स्निपेट जोड़ें:

android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
dexOptions {
        javaMaxHeapSize "4g"
    }
}

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


मैं एंड्रॉइड स्टूडियो में काम कर रहा हूं और रिहाई के लिए एक हस्ताक्षरित एपीके उत्पन्न करने का प्रयास करते समय इस त्रुटि का सामना कर रहा हूं। मैं बिना किसी समस्या के डीबग एपीके बनाने और परीक्षण करने में सक्षम था, लेकिन जैसे ही मैं एक रिलीज एपीके बनाना चाहता था, बिल्ड प्रक्रिया अंत में मिनटों तक चली जाएगी और अंत में "त्रुटि java.lang.OutOfMemoryError: GC ओवरहेड सीमा पार हो गई "। मैंने वीएम और एंड्रॉइड डेक्स कंपाइलर दोनों के ढेर के आकार में वृद्धि की, लेकिन समस्या बनी रही। आखिरकार, कॉफी के कई घंटों और मगों के बाद यह पता चला कि समस्या मेरे ऐप-लेवल 'build.gradle' फ़ाइल में थी - मेरे पास रिलीज बिल्ड प्रकार के लिए 'minifyEnabled' पैरामीटर था 'झूठी' पर सेट, जिसके परिणामस्वरूप प्रोगार्ड सामान चल रहा था कोड पर जो कोड-सिकुड़ने वाली प्रक्रिया के माध्यम से नहीं है ( https://developer.android.com/studio/build/shrink-code.html )। मैंने 'minifyEnabled' पैरामीटर को 'true' में बदल दिया और रिलीज बिल्ड को सपने की तरह निष्पादित किया गया :)

संक्षेप में, मुझे अपनी ऐप-स्तरीय 'build.gradle' फ़ाइल को: // से बदलना पड़ा ...

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign_config_release
    }
    debug {
        debuggable true
        signingConfig signingConfigs.sign_config_debug
    }
}

//...

सेवा मेरे

    //...

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign_config_release
    }
    debug {
        debuggable true
        signingConfig signingConfigs.sign_config_debug
    }
}

//...

यदि आप सुनिश्चित हैं कि आपके प्रोग्राम में कोई मेमोरी लीक नहीं है, तो निम्न प्रयास करें:

  1. ढेर आकार बढ़ाएं, उदाहरण के लिए -Xmx1g
  2. समवर्ती कम विराम संग्राहक को सक्षम करें -XX:+UseConcMarkSweepGC
  3. कुछ स्मृति को बचाने के लिए जब संभव हो तो मौजूदा ऑब्जेक्ट का पुन: उपयोग करें।

यदि आवश्यक हो, तो विकल्प -XX:-UseGCOverheadLimit को कमांड लाइन में जोड़कर सीमा जांच अक्षम की जा सकती है।


error लिए कारण

जीसी ओवरहेड सीमा पार हो गई "इंगित करती है कि कचरा कलेक्टर हर समय चल रहा है और जावा प्रोग्राम बहुत धीमी प्रगति कर रहा है।

कचरा संग्रह के बाद, यदि जावा प्रक्रिया कचरा संग्रह करने के लगभग 98% से अधिक समय व्यतीत कर रही है और यदि यह ढेर के 2% से भी कम हो रहा है और अब तक पिछले 5 (संकलन समय निरंतर) लगातार कचरा कर रहा है संग्रह, फिर एक java.lang.OutOfMemoryError फेंक दिया जाता है

  1. यदि वर्तमान ढेर पर्याप्त नहीं है तो ढेर के आकार में वृद्धि करें
  2. यदि आपको अभी भी ढेर मेमोरी बढ़ाने के बाद यह त्रुटि मिलती है, तो MAT (मेमोरी विश्लेषक उपकरण), विजुअल वीएम इत्यादि जैसे मेमोरी प्रोफाइलिंग टूल का उपयोग करें और मेमोरी लीक को ठीक करें।
  3. नवीनतम संस्करण (1.8.x) या कम से कम 1.7.x पर जेडीके संस्करण को अपग्रेड करें और जी 1 जीसी एल्गोरिदम का उपयोग करें। । जी 1 जीसी के लिए थ्रूपुट लक्ष्य 90 प्रतिशत आवेदन समय और 10 प्रतिशत कचरा संग्रहण समय है
  4. Xms1g -Xmx2g साथ हीप मेमोरी सेट करने के अलावा, कोशिश करें

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m  
    -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
    

जी 1 जीसी के संबंध में कुछ और संबंधित प्रश्न देखें

जावा 7 (जेडीके 7) कचरा संग्रह और दस्तावेज जी 1 पर

उत्पादन में जावा जी 1 कचरा संग्रह

जीसी फाइनेटिंग के लिए ओरेकल टेक्नवर्कवर्क लेख





heap-memory