java.lang.OutOfMemoryError를 처리하는 방법: 자바 힙 공간 오류?

Java 5에서 클라이언트 측 Swing** 애플리케이션(그래픽 글꼴 디자이너)을 작성하고 있습니다. 최근에 메모리 사용량에 대해 보수적이지 않기 때문에 java.lang.OutOfMemoryError: Java 힙 공간 오류가 발생하여 메모리 사용량에 대해 보수적이지 않습니다. 사용자는 파일을 무제한으로 열 수 있으며 프로그램은 열린 개체를 메모리에 보관합니다. 빠른 조사 끝에 5.0 자바 가상 머신의 인체 공학과 다른 사람들이 Windows 시스템에서 JVM의 최대 힙 크기가 '64MB'로 기본값이라고 말하는 것을 발견했습니다.

이 상황을 감안할 때이 제약 조건을 어떻게 처리해야합니까?

자바에 커맨드 라인 옵션을 사용하여 최대 힙 크기를 늘릴 수 있지만 사용 가능한 RAM을 파악하고 시작 프로그램이나 스크립트를 작성해야 합니다. 또한, 최대로 늘린다고 해서 궁극적으로 문제가 해결되지는 않습니다.

파일 시스템에 객체를 자주 유지하도록 일부 코드를 다시 작성하여(데이터베이스 사용도 마찬가지입니다) 메모리를 확보할 수 있습니다. 작동 할 수 있지만 아마도 많은 작업이 필요할 것입니다.

위의 아이디어에 대한 세부 사항이나 자동 가상 메모리, 힙 크기 동적 확장 과 같은 몇 가지 대안을 알려 주시면 감사하겠습니다.

질문에 대한 의견 (2)
해결책

궁극적으로 어떤 플랫폼에서 실행하든 항상 사용할 수 있는 최대 힙은 한정되어 있습니다. Windows 32비트에서는 약 '2GB'입니다(구체적으로 힙이 아니라 프로세스당 총 메모리 양). Java가 기본값을 더 작게 설정하는 이유는 프로그래머가 이 문제에 부딪히지 않고 정확히 무엇을 하고 있는지 검사하지 않고도 메모리 할당이 폭주하는 프로그램을 만들 수 없도록 하기 위해서일 것입니다.

따라서 필요한 메모리 양을 결정하거나 사용 중인 메모리의 양을 줄이기 위해 취할 수 있는 몇 가지 접근 방식이 있습니다. Java나 C#과 같은 가비지 컬렉션 언어에서 흔히 저지르는 실수 중 하나는 더 이상 사용하지 않는 객체에 대한 참조를 계속 유지하거나, 대신 재사용할 수 있는데도 많은 객체를 할당하는 것입니다. 객체에 참조가 있는 한 가비지 컬렉터가 객체를 삭제하지 않기 때문에 힙 공간을 계속 사용하게 됩니다.

이 경우 Java 메모리 프로파일러를 사용하여 프로그램에서 어떤 메서드가 많은 수의 객체를 할당하고 있는지 확인한 다음 더 이상 참조되지 않도록 하거나 애초에 할당하지 않는 방법이 있는지 확인할 수 있습니다. 제가 과거에 사용했던 한 가지 옵션은 (http://www.khelekore.org/jmp/&gt)입니다.

어떤 이유로 이러한 객체를 할당하고 있고 참조를 계속 유지해야 한다고 판단되면(수행하는 작업에 따라 그럴 수도 있습니다) 프로그램을 시작할 때 최대 힙 크기를 늘리기만 하면 됩니다. 그러나 메모리 프로파일링을 수행하고 객체가 할당되는 방식을 이해하면 필요한 메모리 양에 대해 더 잘 알 수 있습니다.

일반적으로 프로그램이 한정된 메모리에서 실행될 것이라고 보장할 수 없는 경우(아마도 입력 크기에 따라 다를 수 있음) 항상 이 문제가 발생합니다. 이 모든 것을 다 소진한 후에야 디스크 등에 객체를 캐싱하는 것을 고려해야 합니다. 이 시점에서 "Xgb의 메모리가 필요하다"고 말할 수 있는 매우 타당한 이유가 있어야 하며 알고리즘이나 메모리 할당 패턴을 개선하여 이 문제를 해결할 수 없습니다. 일반적으로 데이터베이스나 일부 과학적 분석 프로그램과 같이 대규모 데이터 세트에서 작동하는 알고리즘의 경우에만 캐싱 및 메모리 매핑 IO와 같은 기술이 유용합니다.

해설 (1)

힙의 최대 크기를 설정하는 명령줄 옵션 -Xmx를 사용하여 Java를 실행합니다.

자세한 내용은 여기를 참조하세요.

해설 (3)
    • 프로젝트 알마예요 힙 공간 하는 프로젝트에 호스트당 지정할 수 있습니다
  • Eclipse 헬리오스 / 주노 / 케플러는 다음과 같은 캐비닛용입니다 *:

마우스 오른쪽 클릭하면

 Run As - Run Configuration - Arguments - Vm Arguments, 

이 후 추가

-Xmx2048m
해설 (2)

힙 (heap 크기를 키우고, fix&quot &quot 아닙니다. 컴포지션이 &quot plaster&quot, 100%, 임시. 다시 추락할 것이다 바라건대요! 이러한 문제를 피하기 위해 쓰기 고성능 코드입니다.

  1. 지역 변수를 사용하여 가능하면.
  2. 올바른 객체에는 선택해야 합니다. (예: 스트라이버퍼 및 문자열 사이에 선택물을 스트라이베이더)
  3. 좋은 코드를 사용하여 시스템 단축시킵니다 프로그램 (예: 정적 변수를 사용하여 VS 비사양 정적임 변수)
  4. 작업할 수 있는 다른 물건을 코드에.
  5. 함께 이동합니까 시도하시겠습니까 멀티 스레팅
해설 (3)

대량량 경고 - at my office, 저희는 있다는 사실을 우리는 할당할 수 없습니다. (일부 windows 시스템) 이상의 512m for Java 힙. 이 때문에 그들 중 일부는 머신뿐만 카스퍼스키 안티바이러스 제품 설치되어 있는 것으로 나타났다. 우리가 할 수 있는 제거한 후 적어도 1.6gb 이리에, AV 제품, 우리가 늑대굴에서 할당할지 xmx1600m ',' (m 은 필수, 다른 오류가 너무 작아서 초기 heap&quot &quot 다른 현명한 붕괴될 것이라고 말했다.) 작동합니다.

하지만 이런 문제가 발생할 경우 아무 생각이 다른 것으로 드러나 있기 때문에 이런 일이 일어나다니 AV 프로그램은 AV 제품을 작은 메모리 블록이 모든 것을 정말 큰 단일 주소 공간, 나아가 할당일까요.

해설 (0)

Vmo 인수만 가져다줄래요 eclipse 에서 일했다. 이클립스 버전 3.4 사용하는 경우, 다음과 같이

gnu. orghttp://www. '실행하십시오 - &gt. 프로젝트 '에서 선택한 다음, 메이븐 구축하십시오 &gt &gt 실행하십시오 구성 -; 그 후, JRE&quot &quot 탭을 선택합니다. - &gt. 'xmx1024m 입력하고'.

또는 '할 수 있는 &gt 실행하십시오 -; &Gt 실행하십시오 구성 -; 공통공간의 &quot JRE"; 탭 '-' - 'Xmx1024m 입력하고 &gt.

이 프로젝트를 위해 축복내린 구축 / 힙 (heap 메모리 늘려야 합니다. 위의 메모리 크기가 1gb. 원하는 방식으로 최적화할 수 있습니다.

해설 (0)

예, -Xmx를 사용하면 JVM에 더 많은 메모리를 구성할 수 있습니다. 메모리가 누수되거나 낭비되지 않도록 하려면. 힙 덤프를 가져와서 이클립스 메모리 분석기를 사용하여 메모리 소비량을 분석하세요.

해설 (1)

Oracle 에서 추가 권장안을 싶다 문제 해결 글.

스레드 idfsysobject. thread_name: 자바드랑드로토프 모리에로: Java 힙 공간

자바 메시지 내용을 알 수 있는 공간을 &gt, Java 힙 힙 객체에는 할당할 수 없습니다. 이 오류는 메모리 누수가 내포하지는 것이 아닙니다

  • 가능한 causes:*

, 간단한 구성 문제를 여기서 지정된 힙 크기는 1, 응용 프로그램의 부족.

, 응용 프로그램이 본의 아니게 개최 및 개체에 대한 참조를 2. 이렇게 하면 객체에는 쓰레기요 못하게 수집되었습니다.

, 피나리저스 과도하게 사용하면 3.

&gt. 이 오류가 발생할 수 있는 한 다른 잠재적 소스 응용프로그램과의 과도하게 사용하면 피나리저스. Class 는 해당 유형의 완료하십시오 메서드입니다 관심용 객체에는 없는 경우 해당 공간을 재확보할 dell. 가비지 수집 시간

        • 종료에 대한 가비지 수집 후 발생하는 객체에는 대기됩니다 나중에. 서비스 종료에 의해 실행되는 스레드를 디먼이 피나리저스 대기열은. 피나리처 스레드할 따라잡을 수 없어, 그 경우 이 마무리 대기열은 이 유형의 idfsysobject. 약간만이라도 버린 오토프 모리에로 및 Java 힙 가득 찰 수 있습니다.

이러한 상황이 발생할 수 있는 한 책정안 애플리케이션과는 tcpg 마무리 때 우선 순위가 높은 스래드입니다 원인이 되는 것이 보다 빠른 속도로 대기열은 속도를 높일 수 있는 스레드할 피나리처 서비스하는지 대기열은.

해설 (0)

아래 준수하십시오 단계만으로

  1. 오픈 'catalina.sh' 에서 tomcat / bin.

  2. Java_opts 로 변경

JAVA_OPTS = - = - = true 트피레스니코딩 UTF-8 - 서버 - Xms1536m 자바드웨t.헤드리스 &quot.

  • = - = - = - xx 뉴시즈 xmx1536m 256m xx 맥스뉴시즈 256m 페르마시즈 xx 256m
  • Xx 맥스페르마시즈 = xx:+disableexplicitgc&quot 256m -;
  1. Tomcat 재시작하여
해설 (0)

저는 java 에서 힙 크기를 동일한 문제에 직면했다.

나는 두 가지 솔루션을 사용할 경우 jave 5 (1.5).

  1. 그냥 가서 jre install eclipse 의 기본 설정 및 설정되었습니다 jdk1.6 길을 따라 jav1 1.6 설치한.

  2. Check your vmo 인수와 let it be 무슨 일이 있어도. 존재하는 모든 인수만 아래에 한 줄로 추가하기만 vmo 인수만 있다

      • Xx 맥스페르마시즈 = 콜름 (192m) xms512m xmx512m 와 같습니다.

내가 생각하는 그 작동합니다.

해설 (0)

모니터합니다 메모리 사용 할 경우 런타임에 사용할 수 있는 '패키지' 는 '' 자바드란g. 메니지멘스 MBeans 모니터링하도록 메모리 풀 수 있는 vmo 쓰레기 수집 (예, 에덴 공간, 종신 세대 등), 그리고 있다.

이 자유 힙 공간 응용 프로그램에 따라 크게 달라질 수 있다, 특히 GC 에 의해 보고됨 MBeans 생성하는지 객체가 많은 경우 나중에 gc ed. 가능한 한 가지 방법은 모니터링하도록 풀려났거든 힙 공간, 어떤 결정을 내릴 때마다 full gc 사용할 수 있습니다) 에 의한 메모리 공간을 유지한 객체에는.

결국, bet 는 최상의 성능을 최대한 멀리 반면 메모리 고정 제한할 수 있다. 이전 주석문입니다 메모리는 항상 제한되어 있지만, app 로 언급된 너회의 처리하기 위한 메모리 전략을 가지고 있다고 한다.

해설 (0)

어디서 읽었는데 시도하시겠습니까 잡을 수 있는 다른 모든 자원을 확보할 수 있습니다 - 자바드랑드로토프 모리에로 및 ideastorm. catch 블록, 알고 있는 많은 메모리를 사용할 수 있다 ',' 시스템리그스 () 등 접속에만 닫으십시오 재동기화할 다음 다시 해 보다 조교하실 있는모든 할 것입니다.

또 다른 방법이 있지만, 내가 모르는 don& 로만스였나 # 39 이 일을 하지만, 나는 과연 작동합니까 표시할지를 아니하였으매 현재 테스트 중인 프로그램.

이 아이디어는 시스템리그스 () 는 쓰레기 수집을 할 수 있는 여유 메모리가 증가되지는 호출하여 것으로 알려졌다. 확인 후 이 메모리 삼키고 실행하므로 코드를 유지할 수 있습니다.


//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()
해설 (2)

'' 오토프 모리에로 해결할 쉬운 방법은 JVM 옵션을 사용하여 자바 가상 머신 (jvm) 에 최대 힙 크기를 늘릴 xmx512m 와 같습니다 ',' 이 곧바로 해결할 오토프 모리에로. 이것은 나의 Eclipse 에서 오토프 모리에로 가면 우선 솔루션 구축 프로젝트에 대한 프로젝트 때문에 쉽게 할 수 있습니다, 메이븐 또는 ANT 동시에 크기를 기준으로 메모리가 부족합니다.

Jvm 의 예를 들어보겠습니다 최대 힙 크기 또한 계속 증가하고 있다 - Xms 다 1:1 또는 1:1.5 로 더 잘 - Xmx 인컨텍스트 설정할 경우 힙 크기 (너회의 자바 애플리케이션.

'-' = &quot JVM_ARGS 익스포트합니다 Xmx1024m&quot Xms1024m; -;

참조 링크

해설 (1)

Jvm 은 기본적으로 개발을 위한 작은 구성용 다른 작은 크기와 성능 관련 기능. 하지만 운영본 조정할 수 있습니다 (또 특정 애플리케이션 서버 구성 존재할 수 있습니다) - &gt. (예: (협업공간이 그래도말야 isn& # 39, t 충분한 메모리를 충족합니다 요청 및 힙 이미 도달했음 최대 크기를 문제지고 오토프 모리에로 확실)

-Xms        set initial Java heap size
-Xmx        set maximum Java heap size
-Xss        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)

예를 들면 다음과 같습니다. 플랫폼 (platform for linux 에서 운영 모드가 더 꾸미기야.

이 방법을 통해 다운로드한 후 서버 및 구성인텔 http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/

setenv.sh 에서 파일 폴더 /opt/tomcat/bin/ 1.create

   touch /opt/tomcat/bin/setenv.sh

이 모드 설정 및 쓰기 위한 2.open params 좋습니다.

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"

tomcat 재시작하여 '서비스' 3.

&gt. 단, jvm 이 사용하는 것보다 더 많은 메모리를 그냥 힙. 예를 들어 &gt. 자바 네이티브 스레드 스택 및 방법, 핸들은 메모리 할당 &gt. 물론 별도의 JVM 에서 힙, 내부 데이터 구조.

해설 (0)

참고로 이 필요한 경우 사용을 고려해보십시오 구축 상황을 jave WebStart (&quot 있는 ondisk"; 버전, 네트워크 1 - 가능한 자바 가상 머신 (jvm) 에 6u10 아닌 이상) 의 인수를 지정할 수 있기 때문에 다양한 jvm 은 크로스 플랫폼 것입니다.

그렇지 않으면 인수를 운영체제별 launcher 설정하는 있어야 합니다.

해설 (1)

Netbeans 관련된 문제를 해결하기 위해 최대 힙 크기, 설정할 수 있습니다.

39, & # 39 documentum. Run& &gt 어졌다면 -;; # 39, & # 39 설정되었습니다 Configuration& 프로젝트. - &gt. # 39, & # 39 Customise&. - &gt. # 39, & # 39 run&. &gt 뛰어오름 팝업 창이 있다. # 39, & # 39 vmo Option&. - &gt. # 39, & # 39 -. - Xms2048m Xmx2048m& 채웁니다.

해설 (0)

만약 이 문제가 발생하는 제이보스 8 및 JDK1.8 맥스메타스파스 설정, 그럼 우린 지정할 필요가 대신 페르마겐 꾸미기야.

예를 들어 다음과 같은 구성으로 setenv.sh 파일을 제이보스 추가해야 합니다. ',' = 256M&quot xx 맥스메타스파스시즈 &quot java_opts = $ java_opts -;

자세한 내용은 dbasyb 제이보스 힙 문제

해설 (0)

계속 현실화할 경우 &amp. 항상 개체에 대한 참조를 가지고 있는 모든 메모리 양을 찰 수 있습니다.

투명한 &amp 닫으십시오 꼽히는 것은 할 수 있는 파일. 오픈 때 스위치였습니다 탭들 (you only 렉시한테서 대한 포인터입니다 파일이므로 사용자가 탭을 &amp 닫으십시오 스위치에서는 있습니다. 모든 청소하십시오 객체에는. # 39 it&, ll make 파일 변경 느려집니다. 하지만.), 그리고 아마도 렉시한테서 단 3 또는 4 개의 파일을 메모리.

정말 다른 사용자가 파일을 불러올 때 어떻게해야합니다 열었든 요격할 수 있으며, 모든 오토프 모리에로 관심용 (파일을 열 수 있지 않으므로) 는 객체 및 경고자로서 사용자가 이 파일을 닫으십시오 청소하십시오 일곱방과 닫으십시오 비사용률 파일.

네 생각은 동적으로 가상 메모리 확장 doesn& # 39, t, 컴퓨터의 자원에 대한 문제를 해결할 수 있도록 제한되는지 &amp 자르 합니다. 메모리 문제를 처리할 (또는 최소한 자르 수, 그들과 함께).

메모리 누수, ve seen 함께 몇 가지 힌트 i& # 39 입니다.

  • &gt. 그 후 계속 동일팔레트에 컬렉션으로 있음을 잊지 말아야 할 경우 아직 아무 것도 아냐, 넌 무력화시킬 수 있으므로 반드시 무언가 정보기술 (it) 또는 고정 참조입니다 청소하십시오 진행합니다. 찾을 수 없는 경우 메모리 누수 찾기 어렵다.

  • &gt. 아마, 약한 참조를 사용하여 컬렉션 (위하스마프.) , 통해 해결할 수 있는 메모리 문제를 확장하지만 합니다 수 있다는 것을 알 수 있습니다 (it), 자르 당신꺼에요 찾는 객체에는 설정되었습니다 수집되었습니다.

  • &gt. # 39 는 i& 다른 생각, ve 에 저장된 데이터베이스 객체를 사용할 수 있는 최소한의 develope 영구 취합은 투명하게 로드됨. 아마도 이 최고의 외곽진입.

해설 (0)