Eroare java.lang.OutOfMemoryError: GC aeriene depășit limita

I a lua acest mesaj de eroare ca nu-mi execute teste JUnit:

java.lang.OutOfMemoryError: GC overhead limit exceeded

Știu ce o OutOfMemoryError, dar ceea ce are GC aeriene limita să spun? Cum pot rezolva acest lucru?

Comentarii la întrebare (10)
Soluția

Acest mesaj înseamnă că, pentru un motiv oarecare colectorul de gunoaie este de a lua o cantitate excesivă de timp (implicit 98% din toate CPU moment al procesului) și recuperează foarte puțin de memorie în fiecare rulare (implicit 2% din heap).

Acest lucru înseamnă că programul nu mai face nici un progres și este ocupat doar de colectare a gunoiului în orice moment.

Pentru a preveni aplicarea de înmuiere timp de PROCESOR fara a face nimic, JVM aruncă această "Eroare", astfel încât să aveți o șansă de a diagnostica problema.

În cazuri rare, în cazul în care nu'am văzut acest lucru se întâmplă este în cazul în care codul a fost crearea de tone de obiecte temporale și de tone de slab-obiecte referite într-o deja de memorie foarte limitate mediu.

Check out acest articol pentru detalii (în special această parte).

Comentarii (14)

GC aruncă această excepție atunci când prea mult timp este petrecut în colectarea gunoiului pentru prea puțini se întorc, de exemplu. 98% din CPU timp este petrecut pe GC și mai puțin de 2% din heap este recuperat.

Această caracteristică este conceput pentru a preveni aplicații de funcționare pentru o perioadă lungă de timp în timp ce face puțin sau nici un progres, deoarece heap este prea mic.

Puteți dezactiva acest off cu opțiunea de linie de comandă -XX:-UseGCOverheadLimit

Mai multe informatii aici

EDIT: se pare ca cineva posibilitatea să tastați mai repede decât mine :)

Comentarii (6)

Dacă sunteți sigur că nu există pierderi de memorie în programul dumneavoastră, încercați să:

  1. Crește dimensiunea heap, de exemplu -Xmx1g.
  2. Permite concurente scăzut pauză collector -XX:+UseConcMarkSweepGC.
  3. Reutilizarea obiectelor existente, atunci când este posibil pentru a salva de memorie.

Dacă este necesar, limita verifica poate fi dezactivat prin adăugarea opțiunea -XX:-UseGCOverheadLimit la linia de comandă.

Comentarii (1)

L's, de obicei, codul. Aici's un exemplu simplu:

import java.util.*;

public class GarbageCollector {

    public static void main(String... args) {

        System.out.printf("Testing...%n");
        List list = new ArrayList();
        for (int outer = 0; outer < 10000; outer++) {

            // list = new ArrayList(10000); // BAD
            // list = new ArrayList(); // WORSE
            list.clear(); // BETTER

            for (int inner = 0; inner < 10000; inner++) {
                list.add(Math.random());
            }

            if (outer % 1000 == 0) {
                System.out.printf("Outer loop at %d%n", outer);
            }

        }
        System.out.printf("Done.%n");
    }
}

Folosind java 1.6.0_24-b07 Pe un Windows7 pe 32 de biți.

java -Xloggc:gc.jurnal de Gunoier

Apoi uita-te la gc.jurnal

  • A declanșat 444 ori folosind metoda RĂU
  • A declanșat 666 ori folosind metoda mai RĂU
  • A declanșat 354 ori, folosind o metodă MAI bună

Acum, desigur, acest lucru nu este cel mai bun test sau cel mai bun design, dar atunci când se confruntă cu o situație în care nu ai nici o alegere, ci de punere în aplicare astfel o buclă sau atunci când se ocupă cu cod existent care se comportă rău, alegerea de a refolosi obiectele în loc de a crea altele noi, poate reduce numărul de ori colectorul de gunoi stă în cale...

Comentarii (1)

Cauza pentru eroare

GC aeriene depășit limita" indică faptul că colectorul de gunoi este tot timpul de funcționare și program Java este de a face progrese foarte lente.

După o colectare a gunoiului, dacă Java proces este de a cheltui mai mult decât aproximativ 98% din timp face colectarea gunoiului și dacă se recuperează mai puțin de 2% din heap și a făcut atât de mult în ultimii 5 (compilare constantă) consecutive gunoi colecții, apoi o java.lang.OutOfMemoryError este aruncat

  1. Creșterea dimensiunea heap dacă actualul heap nu este suficient.
  2. Dacă aveți în continuare această eroare după creșterea de memorie heap, utilizarea de memorie instrumente de profilare ca MAT ( Memorie instrument de analizor), Visual VM etc. și repara erorile de pierderi de memorie.
  3. Upgrade versiunea JDK la cea mai recentă versiune ( 1.8.x) sau cel puțin 1.7.x și de a folosi G1GC algoritm. . Debitul scopul pentru G1 GC este de 90 la sută timpul de aplicare și de 10 la sută de colectare a gunoiului de timp
  4. În afară de stabilirea memorie heap cu -Xms1g -Xmx2g , încercați

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

Să aruncăm o privire la mai multe întrebări legate de ceea G1GC

https://stackoverflow.com/questions/8111310/java-7-jdk-7-garbage-collection-and-documentation/34254605#34254605

https://stackoverflow.com/questions/2254041/java-g1-garbage-collection-in-production/34254401#34254401

Oracle technetwork articol pentru GC reglaj fin

Comentarii (0)

Doar crește dimensiunea heap un pic de setare această opțiune în

Run → Run Configurații → Argumente → VM argumente

-Xms1024M -Xmx2048M

Xms - pentru limită minimă

Xmx - pentru limită maximă

Comentarii (5)

Pentru mine, următorii pași lucrat:

  1. Deschide eclipse.ini
  2. Schimba

-Xms40m -Xmx512m

pentru a

-Xms512m -Xmx1024m

  1. Reporniți Eclipse

Vezi aici

Comentarii (6)

Următoarele lucrat pentru mine. Trebuie doar să adăugați următorul fragment:

android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

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

încercați acest lucru

deschide construi.gradle fișier

  android {
        dexOptions {
           javaMaxHeapSize = "4g"
        }
   }
Comentarii (1)

creșterea javaMaxHeapsize în a construi.gradle(Modulul:app) fișier

dexOptions {
    javaMaxHeapSize "1g"
}

a (Adăugați această linie în gradle)

 dexOptions {
        javaMaxHeapSize "4g"
    }
Comentarii (0)

Java dimensiunea heap-descriptions (xms, xmx, xmn)

-Xms size in bytes

Example : java -Xms32m

Stabilește dimensiunea inițială a heap Java. Dimensiunea implicită este 2097152 (2MB). Valorile trebuie să fie un multiplu de, și mai mult, 1024 bytes (1KB). (Pe -server pavilion crește dimensiunea implicită de 32M.)

-Xmn size in bytes

Example : java -Xmx2m

Seturi inițiale de Java dimensiunea heap pentru Eden generație. Valoarea implicită este 640K. (Pe -server pavilion crește dimensiunea implicită la 2M.)

-Xmx size in bytes

Example : java -Xmx2048m

Setează dimensiunea maximă la care heap Java poate să crească. Dimensiunea implicită este de 64M. (Pe -server pavilion crește dimensiunea implicită a 128M.) Maxim heap limita este de aproximativ 2 GB (2048MB).

Java memorie argumente (xms, xmx, xmn) formatare

Când setarea dimensiunea heap Java, trebuie să specificați memoria argument folosind una dintre literele "m" sau "M" pentru MB, sau "g" sau "G" pentru GB. Setarea dvs. nu va funcționa dacă specificați "MB" sau "GB." Argumente valabile arata astfel:

-Xms64m sau -Xms64M -Xmx1g sau -Xmx1G Puteți folosi, de asemenea, 2048MB pentru a specifica 2GB De asemenea, asigurați-vă că utilizați doar numere întregi atunci când se specifică argumentele. Folosind -Xmx512m este o opțiune valabilă, dar -Xmx0.5g va cauza o eroare.

Această referință poate fi de ajutor pentru cineva.

Comentarii (0)

Repornirea meu MacBook fix această problemă pentru mine.

Comentarii (0)

Puteți crește, de asemenea, alocarea de memorie și dimensiunea heap prin adăugarea asta gradle.proprietăți fișier:

org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g

Nu't trebuie să fie 2048M și 32g, face la fel de mare, după cum doriți.

Comentarii (0)

Pentru a crește dimensiunea heap în IntelliJ IDEA urmați instrucțiunile de mai jos. Ea a lucrat pentru mine.

Pentru Utilizatorii De Windows,

Du-te la locația unde IDE este instalat și de căutare pentru următoarele.

idea64.exe.vmoptions

Editați fișierul și adăugați următoarele.

-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m

Asta este !!

Comentarii (0)

Am'm de lucru în Android Studio și a întâlnit această eroare atunci când încearcă pentru a genera o semnat APK for de presă. Am fost capabil de a construi și testa un debug APK cu nici o problema, dar de îndată ce am vrut să construiesc un comunicat APK, procesul de construire va rula timp de minute în șir și apoi în cele din urmă termina cu "Eroare java.lang.OutOfMemoryError: GC aeriene depășit limita". Am crescut heap dimensiuni atât pentru VM și Android DEX compilator, dar problema a persistat. În cele din urmă, după multe ore si cani de cafea s-a dovedit că problema a fost în aplicația mea-nivel 'de a construi.gradle' fișier - am avut 'minifyEnabled' parametru pentru eliberarea construi tip setat la 'fals', prin urmare funcționare Proguard umpluturi pe cod care nu't fost prin codul-scădere' proces (a se vedea https://developer.android.com/studio/build/shrink-code.html). Am schimbat 'minifyEnabled' parametru pentru a 'adevărat' si eliberarea construi executat ca un vis :)

Pe scurt, am avut de a schimba la nivel de aplicație 'de a construi.gradle' fișier de: //...

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
    }
}

//...

pentru a

    //...

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
    }
}

//...
Comentarii (0)

Aveți nevoie pentru a crește dimensiunea memoriei în Jdeveloper du-te la setDomainEnv.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**
)

și

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**
Comentarii (1)

Rezolvat: Trebuie doar să adăugați org.gradle.jvmargs=-Xmx1024m în gradle.proprietăți și dacă nu există, creați-l.

Comentarii (0)

În Netbeans, ar putea fi util pentru a proiecta un max-heap de dimensiune. Du-te la Run => Set de Configurare a Proiectului => Personaliza. În Run a sa a apărut fereastra, du-te la VM Opțiune, completați -Xms2048m -Xmx2048m. S-ar putea rezolva dimensiunea heap problema.

Comentarii (0)