"java.lang"을 다루는 방법Out Of Memory Error: Java 힙 공간" 오류입니까?
Java 5에 클라이언트 측 Swing 어플리케이션(그래픽 폰트 디자이너)을 쓰고 있습니다.저는 요즘...java.lang.OutOfMemoryError: Java heap space메모리 사용량을 줄이지 않기 때문에 에러가 발생합니다.사용자는 파일을 무제한으로 열 수 있으며 프로그램은 열린 개체를 메모리에 보관합니다.빠른 조사 후 5.0 Java Virtual Machine의 인체공학 및 기타 Windows 머신에서 JVM의 기본 최대 힙사이즈는 다음과 같습니다.64MB.
이런 상황에서 어떻게 대처해야 할까요?
명령줄 옵션을 사용하여 최대 힙 크기를 java로 늘릴 수 있지만, 그러기 위해서는 사용 가능한 RAM을 파악하고 실행 프로그램이나 스크립트를 작성해야 합니다.또, 어느 정도의 유한 최대까지 증가한다고 해서, 최종적으로 문제가 해소되는 것은 아닙니다.
오브젝트를 파일 시스템에 자주 유지하도록 코드를 일부 고쳐 쓸 수 있습니다(데이터베이스를 사용하는 것도 마찬가지). 메모리를 해방할 수 있습니다.잘 될 수도 있지만, 아마 일도 많을 거예요.
위의 아이디어에 대한 자세한 내용이나 힙 크기를 동적으로 확장하는 자동 가상 메모리와 같은 몇 가지 대안을 알려주시면 감사하겠습니다.
궁극적으로 어떤 플랫폼에서 실행하든 항상 사용할 수 있는 힙의 최대 수는 한정되어 있습니다.에서는, 이것은 32 의 「」에 관한 입니다.2GB(특히 힙이 아니라 프로세스당 메모리의 합계량).자바가 디폴트를 작게 하는 것을 선택했을 뿐입니다(프로그래머가 메모리 할당이 폭주하는 프로그램을 작성하려면 , 이 문제에 부딪쳐, 정확하게 무엇을 하고 있는지를 조사할 필요가 있습니다).
따라서 필요한 메모리 양을 결정하거나 사용 중인 메모리 양을 줄이기 위해 여러 가지 방법을 사용할 수 있습니다.Java나 C# 등의 가비지 수집 언어에서 흔히 볼 수 있는 실수 중 하나는 사용하지 않는 오브젝트에 대한 참조를 계속 유지하거나 대신 재사용할 수 있는 오브젝트를 여러 개 할당하는 것입니다.오브젝트에 참조가 있는 한 가비지 컬렉터가 해당 오브젝트를 삭제하지 않기 때문에 힙스페이스를 계속 사용합니다.
이 경우 Java 메모리프로파일러를 사용하여 프로그램 내의 어떤 메서드가 다수의 오브젝트를 할당하고 있는지 판별한 후 오브젝트가 참조되지 않는지 확인할 수 있습니다.또는 처음부터 할당하지 않을 수 있습니다.제가 과거에 사용한 옵션 중 하나는 "JMP" http://www.khelekore.org/jmp/입니다.
어떤 이유로 이러한 개체를 할당하고 있으며 참조를 유지할 필요가 있는 경우(이 경우 수행 중인 작업에 따라 다름) 프로그램을 시작할 때 최대 힙 크기를 늘리기만 하면 됩니다.그러나 메모리 프로파일링을 수행하고 객체가 어떻게 할당되는지 파악한 후에는 필요한 메모리 양을 더 잘 파악해야 합니다.
일반적으로 프로그램이 한정된 양의 메모리(아마도 입력 크기에 따라 다름)에서 실행되도록 보장할 수 없는 경우에는 항상 이 문제가 발생합니다.이 모든 것을 마친 후에만 오브젝트를 디스크 등에 캐싱할 필요가 있습니다.이 시점에서는, 「XGB 메모리가 필요합니다」라고 하는 타당한 이유가 있어, 알고리즘이나 메모리 할당 패턴을 개선하는 것으로는 대응할 수 없습니다.일반적으로 이는 대규모 데이터셋(데이터베이스 또는 일부 과학 분석 프로그램 등)에서 작동하는 알고리즘의 경우에만 해당되며, 캐싱 및 메모리 매핑 IO와 같은 기술이 유용하게 됩니다.
"Java" 를 를 합니다.-Xmx힙의 최대 크기를 설정합니다.
프로젝트에 필요한 힙 공간의 양을 프로젝트별로 지정할 수 있습니다.
다음은 Eclipse Helios/Juno/Kepler의 경우입니다.
마우스 오른쪽 버튼 클릭
Run As - Run Configuration - Arguments - Vm Arguments,
그럼 이걸 추가해 주세요
-Xmx2048m
힙 크기를 늘리는 것은 "수정"이 아니라 "플래스터"이며 100% 임시입니다.다른 곳에서 다시 충돌합니다.이러한 문제를 방지하려면 고성능 코드를 작성하십시오.
- 가능한 경우 로컬 변수를 사용하십시오.
- 올바른 개체를 선택했는지 확인합니다(EX: String, String Buffer 및 String Builder 중 선택).
- 프로그램에 적합한 코드 시스템을 사용합니다(EX: 정적 변수 VS 비 정적 변수 사용).
- 당신의 코드에 적용될 수 있는 다른 것들.
- 멀티 스레딩으로 이동 시도
큰 경고입니다만, 제 사무실에서는 (일부 윈도 머신에서는) Java 힙에 512m를 할당할 수 없었습니다.이는 일부 기기에 설치된 Kaspersky 안티바이러스 제품 때문인 것으로 밝혀졌다. AV 제품을 한 결과, 1.6의 AV 제품을 할 수 GB gb 、 gb gb gb gb gb gb gb gb 。-Xmx1600m " heap에러가 합니다). (m은 동작합니다Too small initial heap (초기 힙이 너무 작음)작합니니다다
이것이 다른 AV 제품에서 발생하는지는 알 수 없지만, 아마도 AV 프로그램이 모든 주소 공간에 작은 메모리 블록을 예약하기 때문에 하나의 큰 할당을 방지할 수 있기 때문일 것입니다.
VM의 인수는 전혀 효과가 없었습니다.이클립스 버전 3.4를 사용하는 경우 다음을 수행합니다.
에 Run --> Run Configurations -->build에서 -->를후 > "Maven build --> "JRE" 를 입력합니다.-Xmx1024m.
하다, 하다, 하다, 하다, 하다, 이렇게 할 수도 요.Run --> Run Configurations --> select the "JRE" tab --> 다음 -어리다 -어리다 -어리다를 입력합니다.Xmx1024m
그러면 모든 빌드/프로젝트의 메모리 힙이 증가합니다.위의 메모리 크기는 1GB입니다.원하는 방식으로 최적화할 수 있습니다.
oracle 트러블 슈팅 기사에서 추천을 추가하겠습니다.
스레드 thread_name: java.lang에 예외가 있습니다.Out Of Memory Error: Java 힙 공간
상세 메시지 Java 힙스페이스는 Java 힙에 개체를 할당할 수 없음을 나타냅니다.이 오류가 반드시 메모리 누수를 의미하는 것은 아닙니다.
생각할 수 있는 원인:
애플리케이션에 대해 지정된 힙 크기가 부족한 단순한 구성 문제입니다.
애플리케이션이 의도하지 않게 개체에 대한 참조를 보유하고 있으므로 개체가 가비지 수집되지 않습니다.
피니셔가 과도하게 사용되었습니다.
이 에러의 또 다른 잠재적인 원인은, 최종자를 과도하게 사용하는 애플리케이션입니다.클래스에 최종 메서드가 있는 경우 해당 유형의 개체에는 가비지 수집 시 해당 공간이 회수되지 않습니다.
가비지 수집 후 개체는 나중에 완료하기 위해 대기열에 들어갑니다.finalizer는 finalization 큐에 서비스를 제공하는 데몬 스레드에 의해 실행됩니다.파이널라이저 스레드가 파이널라이제이션큐를 따라가지 못할 경우 Java 힙이 가득 차서 이런 유형의 Out Of Memory Error 예외가 느려집니다.
이 상황을 일으킬 수 있는 시나리오 중 하나는 어플리케이션이 priority가 높은 스레드를 생성하여 파이널라이즈 스레드가 큐를 처리하는 속도보다 빠른 속도로 파이널라이즈 큐를 증가시키는 경우입니다.
,, 럼과 함께-XmxJVM에 추가 메모리를 구성할 수 있습니다.메모리 유출이나 낭비를 방지하기 위해.힙 덤프를 가져와서 Eclipse Memory Analyzer를 사용하여 메모리 사용량을 분석합니다.
다음의 순서에 따릅니다.
.
catalina.shbin.syslog/binsyslog.syslogJAVA_OPTS를 다음으로 변경하다
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"Tomcat을 재시작합니다.
디폴트로는 개발의 경우 JVM은 다른 퍼포먼스 관련 기능에 작은 사이즈와 작은 구성을 사용합니다.단, 실제 가동 환경에서는 (어플리케이션서버 고유의 설정이 존재할 수 있습니다)-> (요구를 충족하기에 충분한 메모리가 없고 힙이 이미 최대 크기에 도달한 경우 Out Of Memory Error가 발생합니다.)
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)
예를 들어 다음과 같습니다.Linux Platform에서 운영 모드용 설정.
http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/ 에서 서버를 다운로드 및 구성한 후
1. /opt/syslog/bin/ 폴더에 setenv.sh 파일을 만듭니다.
touch /opt/tomcat/bin/setenv.sh
2. 원하는 모드를 설정하기 위해 이 파라미터를 열고 씁니다.
nano /opt/tomcat/bin/setenv.sh
export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"
3.service tomcat restart
JVM은 힙뿐만 아니라 더 많은 메모리를 사용합니다.예를 들어 Java 메서드, 스레드 스택 및 네이티브핸들은 JVM 내부 데이터 구조뿐만 아니라 힙과는 별도로 메모리에 할당됩니다.
java.lang을 글을 다른 요. Of Memory 및block에서는 이 있는 Of Memory Error를 할 수 .System.gc()뭘 하려던 간에 다시 시도해보죠
또 다른 방법은 이것이 잘 될지는 모르겠지만, 현재 어플리케이션으로 동작할 수 있는지 테스트하고 있습니다.
이 아이디어는 System.gc()를 호출하여 가비지 수집을 수행하는 것입니다.이것에 의해, 빈 메모리가 증가하는 것을 알 수 있습니다.메모리 고블링 코드가 실행된 후에도 계속 확인할 수 있습니다.
//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);
Runtime runtime = Runtime.getRuntime();
if(runtime.freeMemory()<minRunningMemory)
System.gc();
OutOfMemoryError options java를 를 늘리는 것입니다.-Xmx512M그러면 Out Of Memory Error가 즉시 해결됩니다.프로젝트 구축 중에 Eclipse, Maven 또는 ANT에서 Out Of Memory Error가 발생했을 때 이 솔루션을 사용하는 것이 좋습니다.프로젝트 크기에 따라서는 메모리가 쉽게 부족해질 수 있기 때문입니다.
다음으로 JVM의 최대 힙사이즈를 늘리는 예를 나타냅니다.또한 Java 어플리케이션에서 힙사이즈를 설정할 때는 -Xmx에서 -Xms의 비율을 1:1 또는 1:1.5로 유지하는 것이 좋습니다.
export JVM_ARGS="-Xms1024m -Xmx1024m"
자바 힙사이즈에서도 같은 문제가 발생하였습니다.
java 5(1.5)를 사용하시는 경우는, 2개의 솔루션이 있습니다.
jdk1.6을 설치하고 exclipse 기본 설정으로 이동하여 jav1 1.6의 jre 경로를 설치 시 설정합니다.
VM 인수를 확인하고 그대로 두십시오. VM 인수에 있는 모든 인수 중 -Xms512m -Xmx512m -XX:MaxPermSize=...m(192m)로 한 줄을 추가하십시오.
잘 될 것 같은데...
실행 시 메모리 사용량을 감시해야 하는 경우java.lang.management패키지 제공MBeansVM의 메모리 풀(에덴 공간, 테넌트 생성 등)을 모니터링하고 가비지 수집 동작을 모니터링하는 데 사용할 수 있습니다.
이러한 MBeans에 의해 보고되는 여유 힙공간은 GC 동작에 따라 크게 달라집니다.특히 어플리케이션이 나중에 GC에딩되는 많은 개체를 생성하는 경우에는 더욱 그렇습니다.가능한 접근법 중 하나는 풀 GC를 실행할 때마다 사용 가능한 힙스페이스를 감시하는 것입니다.이를 사용하여 오브젝트를 유지함으로써 메모리를 해방할지를 결정할 수 있습니다.
궁극적으로는 퍼포먼스가 허용 가능한 상태로 메모리 보유를 가능한 한 제한하는 것이 최선의 방법입니다.앞서 언급한 바와 같이 메모리는 항상 제한되어 있지만, 당신의 앱은 메모리 소진에 대처하기 위한 전략을 가지고 있어야 합니다.
전개 상황에서 이것이 필요한 경우 Java WebStart(Java 6u10 이후로는 네트워크 버전이 아닌 "ondisk" 버전)를 사용하는 것을 검토하십시오.이 버전에서는 JVM에 대한 다양한 인수를 크로스 플랫폼 방식으로 지정할 수 있습니다.
그렇지 않으면 필요한 인수를 설정하는 운영 체제별 런처가 필요합니다.
Android Studio의 경우 다음 행 끝에 이 행을 추가/변경합니다.gradle.properties (Global Properties):
...
org.gradle.jvmargs=-XX\:MaxHeapSize\=1024m -Xmx1024m
1024개 이상의 힙 크기를 사용하여 재시도할 수 있습니다.
리액트 네이티브에서 이 문제를 검색하기 위해 여기에 왔다면.
그럼 이렇게 해야겠네
cd android/ && ./gradlew clean && cd ..
다음 코드를 Android/gradle.properties에 추가합니다.
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
이 문제가 Wildfly 8 및 JDK1.8에서 발생하는 경우 PermGen 설정 대신 MaxMetaSpace 설정을 지정해야 합니다.
예를 들어 다음과 같은 설정을 setenv.sh 파일의 와일드플라이에 추가해야 합니다. JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"
넷빈에 대해서는 최대 힙사이즈를 설정하여 문제를 해결할 수 있습니다.
'실행'으로 이동하여 팝업창의 '프로젝트 설정' --> '커스텀' --> '실행' --> 'VM 옵션' --> '-Xms2048m-Xmx2048m'을 입력합니다.
오브젝트에 대한 참조를 계속 할당 및 유지하면 보유한 메모리 용량이 모두 채워집니다.
탭 전환 시 투과적인 파일 닫기 및 열기(파일에 대한 포인터만 유지하고 사용자가 탭을 전환하면 모든 오브젝트를 닫고 청소합니다)가 하나의 옵션입니다.파일 변경은 늦어질 수 있지만...) 및 메모리에 3-4개의 파일만 저장할 수 있습니다.
또한 사용자가 파일을 열고 로드하고 Out Of Memory Error를 대행 수신한 후 파일을 닫고(파일을 열 수 없으므로), 해당 개체를 청소하고 사용하지 않는 파일을 닫아야 함을 사용자에게 경고합니다.
가상 메모리를 동적으로 확장한다고 해서 문제가 해결되는 것은 아닙니다.머신은 리소스가 한정되어 있기 때문에 신중하게 메모리 문제를 처리해야 합니다(적어도 신중하게 처리해야 합니다).
메모리 누전에 관한 힌트는 다음과 같습니다.
--> 컬렉션에 어떤 것을 넣었는데 나중에 그것을 잊어버린 경우, 당신은 여전히 그것에 대한 강한 참조를 가지고 있기 때문에 컬렉션을 무효화하거나, 클리닝을 하거나, 또는 그것을 사용해 무언가를 실시하거나 하는 것에 주의해 주세요.그렇지 않으면 메모리 누수를 찾기 어려울 것입니다.
--> 참조가 약한 컬렉션(weakhashmap...)을 사용하면 메모리의 문제에 도움이 될 수 있지만, 찾고 있는 오브젝트가 수집되어 있는 경우가 있기 때문에 주의해야 합니다.
--> 제가 발견한 또 다른 아이디어는 가장 적게 사용되고 투과적으로 로드된 데이터베이스 오브젝트에 저장된 영속적인 컬렉션을 개발하는 것입니다.이게 최선의 방법일 거야
Android Studio
File -> Invalidate Caches and Restart solved it for me :)
If this error occurs right after execution of your junit tests, then you should execute Build -> Rebuild Project.
If this error comes up during APK generation in react-native, cd into the android folder in your project and do:
./gradlew clean
then
./gradlew assembleRelease
If error persists, then, restart your machine.
Add this line to your gradle.properties file
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
It should work. You can change MaxPermSize accordingly to fix your heap problem
In my case it solved by assigning more memory to Shared build process heap size in intellij settings.
Go to intellij settings > Compiler > Shared build process heap size
If everything else fails, in addition to increasing the max heap size try also increasing the swap size. For Linux, as of now, relevant instructions can be found in https://linuxize.com/post/create-a-linux-swap-file/.
This can help if you're e.g. compiling something big in an embedded platform.
if you got this error when you launch eclipse birt 1- you will go in the file of the eclipse configuration 2- you must open eclipse.init 3- modified the RAM memory, you can increase this, i give an example.
my old information was : -Xmx128m -XX:MaxPermSize=128m
the new modification that i opered :
-Xmx512m -XX:MaxPermSize=512m
this modification will permit me to resolve java heap space when i launch my report in my browser.
Thanks
Java OOM Heap space issue can also arise when your DB connection pool got full.
I faced this issue because of my Hikari Connection pool (when upgraded to Spring boot 2.4.*) was full and not able to provide connections anymore (all active connections are still pending to fetch results from database).
Issue is some of our native queries in JPA Repositories contain ORDER BY ?#{#pageable} which takes a very long time to get results when upgraded.
Removed ORDER BY ?#{#pageable} from all the native queries in JPA repositories and OOM heap space issue along with connection pool issue got resolved.
If you are using Android Studio just add these lines with gradle.properties file
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=maxm -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
언급URL : https://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error
'source' 카테고리의 다른 글
| JavaScript 문자열 스트립()? (0) | 2022.10.18 |
|---|---|
| 디자인 패턴 웹 기반 응용 프로그램 (0) | 2022.10.18 |
| PHP 세션이 하위 도메인으로 전달되도록 허용 (0) | 2022.10.18 |
| PHP에서 루프를 종료할 수 있습니까? (0) | 2022.10.18 |
| MariaDB/MySQL에서 전체 텍스트 검색을 위해 문자열을 이스케이프하는 방법 (0) | 2022.10.18 |
