programing

java.displaces를 클릭합니다.Out Of Memory Error: GC 오버헤드 제한을 초과했습니다.

luckcodes 2022. 8. 15. 11:06

java.displaces를 클릭합니다.Out Of Memory Error: GC 오버헤드 제한을 초과했습니다.

각각 몇 개(15~20개)의 텍스트엔트리를 가진 여러 개의 (수십만 개의) 해시 맵개체를 작성하는 프로그램에서 이 오류가 발생합니다.이러한 문자열은 데이터베이스로 전송되기 전에 (소량으로 분할하지 않고) 모두 수집해야 합니다.

Sun에 따르면 오류는 "가비지 수집에 너무 많은 시간을 소비하는 경우: 총 시간의 98% 이상이 가비지 수집에 소비되고 2% 미만이 복구되면 Out Of Memory Error가 발생합니다."

명령줄을 사용하여 JVM에 인수를 전달할 수 있습니다.

  • "-Xmx1024m" (또는 그 이상)을 통한 힙 크기 증가 또는
  • "-XX:-UseGCOverhead Limit"을 통해 오류 체크를 모두 비활성화합니다.

첫 번째 접근법은 정상적으로 작동하고 두 번째 접근법은 다른 java.lang으로 끝납니다.이번에는 히프에 관한 Out Of Memory Error입니다.

그래서 질문: 특정 사용 사례(예: 여러 개의 작은 HashMap 개체)에 대해 이에 대한 프로그램적 대안이 있습니까?예를 들어 HashMap clear() 메서드를 사용하면 문제가 사라지지만 HashMap에 저장된 데이터도 사라집니다. :-)

이 문제는 StackOverflow 관련 항목에서도 설명됩니다.

프로세스를 원활하게 실행하기 위해 기본적으로 메모리가 부족합니다.생각할 수 있는 옵션:

  1. 것처럼 더 하고, 에서 메모리를 사용해 .중간에, 다음과 같은 것을 시험해 보세요.-Xmx512m 먼저
  2. 로 작업하다HashMap한 한
  3. 중복된 문자열이 많을 경우 해당 문자열을 사용하여HashMap
  4. 생성자를 사용하여 사례에 맞게 조정

다음은 나에게 효과가 있었다.다음 스니펫을 추가합니다.

dexOptions {
        javaMaxHeapSize "4g"
}

★★★★★★★★★★★★★★★build.gradle:

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.1'

    defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {

    }

    dexOptions {
        javaMaxHeapSize "4g"
    }
}

@takrl: 이 옵션의 기본 설정은 다음과 같습니다.

java -XX:+UseConcMarkSweepGC

이 으로 활성화되지 . ' 하다'라는옵션을 요.+XX:UseConcMarkSweepGC다음과 같은 구문을 사용하고 있었을 것입니다.

java -XX:+UseConcMarkSweepGC

즉, 이 옵션을 명시적으로 활성화하고 있는 것입니다.는, 「」를 참조해 .Java HotSpot VM Options@ 이 문서

참고로 오늘도 같은 문제가 있었습니다.이 옵션을 사용하여 수정했습니다.

-XX:-UseConcMarkSweepGC

이로 인해 가비지 수집에 사용되는 전략이 변경되어 문제가 사라졌습니다.

음... 다음 중 하나가 필요합니다.

  1. 알고리즘과 데이터 구조를 완전히 재검토하여 이러한 작은 해시맵을 필요로 하지 않도록 합니다.

  2. 필요에 따라서, 메모리내의 HashMaps 를 페이징 할 수 있는 파사드를 작성합니다.단순한 LRU 캐시가 딱 좋은 티켓일 수 있습니다.

  3. JVM에 사용할 수 있는 메모리 업.필요에 따라 RAM을 증설하는 것이 가장 빠르고 저렴한 솔루션이 될 수 있습니다.이러한 메모리를 호스트하는 머신을 관리할 수 있는 경우입니다.그렇다고는 해도:저는 일반적으로 "하드웨어를 더 많이 투입"하는 솔루션의 팬은 아닙니다.특히 적절한 시간 내에 대체 알고리즘 솔루션을 생각해 낼 수 있는 경우에는 더욱 그렇습니다.이러한 모든 문제에 하드웨어를 계속 투입하면 곧 수익 감소의 법칙에 직면하게 됩니다.

근데 진짜 뭘 하려고 하는 거야?당신의 실제 문제에 대한 더 나은 접근법이 있을 것 같군요.

대체 HashMap 구현(Trove)을 사용합니다.표준 Java HashMap의 메모리 오버헤드는 12배 이상입니다.자세한 내용은 이쪽에서 보실 수 있습니다.

끝까지 기다리는 동안 전체 구조를 메모리에 저장하지 마십시오.

중간 결과를 해시맵 대신 데이터베이스 내의 임시 테이블에 씁니다.기능적으로 데이터베이스 테이블은 해시맵과 동등합니다.즉, 양쪽 모두 데이터에 대한 키드 액세스를 지원하지만 테이블은 메모리에 바인딩되지 않으므로 해시맵이 아닌 인덱스된 테이블을 사용하십시오.

올바르게 실행되면 알고리즘은 변경조차 인식하지 못할 것입니다.여기서 올바르게는 해시맵과 같은 put(key, value) 및 get(key) 메서드를 제공하더라도 클래스를 사용하여 테이블을 나타내는 것을 의미합니다.

중간 테이블이 완료되면 메모리 대신 해당 테이블에서 필요한 sql 문을 생성합니다.

.OutOfMemoryError가비지 수집에 너무 많은 시간을 할애하고 있는 경우.총% 가 2%, "98%"는 2%로 회복됩니다.OutOfMemoryError던져질 것이다.이 기능은 힙이 너무 작기 때문에 응용 프로그램이 장시간 실행되지 않도록 하면서 거의 또는 전혀 진행되지 않도록 설계되었습니다.에 따라서, 이 , 「」합니다.-XX:-UseGCOverheadLimit명령행으로 이동합니다.

수십만 개의 해시 맵을 작성하는 경우, 실제로 필요한 것보다 훨씬 더 많은 해시 맵을 사용하고 있을 것입니다.대용량 파일이나 그래픽을 사용하지 않는 한 단순한 데이터를 저장하는 것이 Java 메모리 제한을 초과해서는 안 됩니다.

알고리즘을 다시 생각해 보세요.이 경우, 저는 그 문제에 대해 더 많은 도움을 드리고 싶지만, 당신이 문제의 상황에 대해 더 많은 정보를 제공할 때까지 어떠한 정보도 제공할 수 없습니다.

Java8이 있고 G1 Garbage Collector를 사용할 수 있는 경우 다음 명령을 사용하여 응용 프로그램을 실행합니다.

 -XX:+UseG1GC -XX:+UseStringDeduplication

이것에 의해, G1은 같은 스트링을 검색해, 그 중 1개만을 메모리에 보관하도록 지시합니다.다른 것은 그 String에 대한 포인터일 뿐입니다.

이것은 반복 문자열이 많을 때 유용합니다.이 솔루션은 각 애플리케이션에 따라 동작하거나 동작하지 않을 수 있습니다.

이쪽:
https://blog.codecentric.de/en/2014/08/string-deduplication-new-feature-java-8-update-20-2/httpsblog.codecentric.de/en/2014/08//http://java-performance.info/java-string-deduplication/httpjava-performance.info//

Eclipse MAT 또는 Visual VM 등의 프로파일 툴을 사용하여 애플리케이션 메모리 누수 수정

★★★★★★★★★★★★★★★★ JDK 1.7.x에서는 " " " 를 사용합니다.G1GC이는 다른 GC 알고리즘의 2%와 달리 가비지 수집에 10%를 소비합니다.

를 「」로 하는 것 에, 「」-Xms1g -Xmx2g 「 」, 「 」를 시험해 .

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

이러한 파라미터의 미세조정에 대해서는 Oracle 문서를 참조해 주십시오.

SE의 G1GC에 관한 질문:

G1에서의 Java 7(JDK 7) 가비지 수집 및 문서

운영 중인 Java G1 가비지 컬렉션

공격적인 가비지 컬렉터 전략

이를 위해 Android closure 아래의 앱 그래들 파일에서 아래 코드를 사용합니다.

덱스 옵션 {JavaMaxHeapSize "4g"}

오류가 발생한 경우:

"내부 컴파일러 오류: java.lang.Out Of Memory Error: java.lang에서 GC 오버헤드 제한을 초과했습니다.Abstract String Builder"

힙 즉, 힙 공간을 2GB로 늘립니다.-Xmx2g.

Jdeveloper에서 메모리 크기를 늘려야 합니다.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
)
and

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

저 같은 경우에는 다음을 사용하여 메모리를 늘립니다.-Xmx옵션이 해결책이었습니다.

자바에서 10g 파일을 읽었는데 매번 같은 오류가 발생했어요.이 문제는 의 값이RES에 기고하다.top명령어가 -Xmx 옵션에서 설정된 값에 도달했습니다.그런 다음 다음 를 사용하여 메모리를 늘림으로써-Xmx모든 게 잘 풀렸어요

또 다른 포인트가 있어요.설정했을 때JAVA_OPTS또는CATALINA_OPTS내 사용자 계정에서 메모리 용량을 다시 늘렸기 때문에 동일한 오류가 발생하였습니다.그 후, 그 환경 변수의 값을 코드에 인쇄해, 설정한 값과는 다른 값을 부여했습니다.그 이유는 Tomcat이 그 프로세스의 루트였기 때문입니다.그리고 저는 su-doer가 아니기 때문에 관리자에게 메모리를 늘려달라고 부탁했습니다.catalina.sh를 클릭합니다.

이것은 이 오류를 없애는 데 도움이 되었습니다.이 옵션은 -XX:+DisableExplicit를 사용하지 않도록 설정합니다.GC

언급URL : https://stackoverflow.com/questions/5839359/java-lang-outofmemoryerror-gc-overhead-limit-exceeded