2011-02-18 7 views
2

아래에서 오류가 발생합니다.해결 방법 java.lang.OutOfMemoryError

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space. 

누군가가이 문제를 해결하는 방법을 알고 있습니까?

감사합니다,
마헨드라 Athneria 대신 @keatch로 System.gc()을 강제

+0

힙 공간을 늘리려고 했습니까? 어쩌면 메모리가 많이 필요합니다 (기본값은 매우 낮습니다) –

+0

스택 추적을 추가 할 수 있다면 도움이됩니다. 주어진 정보로 원인을 진단하는 것은 불가능합니다. –

+0

[ "java.lang.OutOfMemoryError : Java 힙 공간"오류 (64MB 힙 크기)를 처리하는 방법] (http://stackoverflow.com/questions/37335/how-to-deal-with-java- lang-outofmemoryerror-java-heap-space-error-64MB-heap) – Mark

답변

0

내가 그것을 메모리 누출 무엇을 찾아 더 나은 생각 제안했다. 문제의 원인을 찾는 데 도움이되는 jHat (Java Heap Analysis Tool) 도구가 있습니다.

Here 설명 힙 덤프를 만드는 방법.

4

메모리를 적게 사용하십시오.

실행중인 응용 프로그램의 종류를 모른 채 문제가 무엇인지 정확하게 말하기는 어렵습니다. 그래서이 대답은이 문제를 다루기위한 일반적인 조언을 포함 할 것입니다.

JDK와 함께 제공되는 jvisualvm 응용 프로그램을 사용하십시오. 실행중인 프로세스에 연결하고 메모리가 어떻게 사용되고 있는지 분석 할 수 있습니다.

거기에 없어야 할 많은 수의 개체가 있는지 조사합니다. 한 클래스의 인스턴스가 20,000 개 있다는 것을 알게되면 수학을 수행하고 실제로 많은 클래스가 있는지 확인하십시오. 실제로 존재해야하는 것보다 더 많은 인스턴스가있는 오브젝트 유형을 찾으십시오. 그럼 왜 그렇게 많은지 알아 내야합니다.

이러한 추가 개체는 생성 중이며 제대로 역 참조되지 않을 수 있습니다. 어딘가에 데이터 구조에 넣을 수도 있고 제거하지 않을 수도 있습니다. 필요한만큼 끝내지 않는이 데이터를 참조하는 스레드가 계속 실행 중일 수 있습니다. 가비지 수집해야하는 데이터를 계속 참조하는 이유는 여러 가지가 있습니다.

중요한 정보는 어떤 개체 클래스가 이와 같이 수량이 폭발 하는지를 아는 것입니다. 일단 그 사실을 알게되면, 그 클래스의 생성자와 소멸자를 오버라이드하여 얼마나 많은 객체가 생성되고 소멸되었는지, 그리고 어디에서 로그했는지 기록 할 수 있습니다. 이 데이터를 통해 추가 오브젝트가 작성되는 위치 또는 삭제되지 않는 위치를 판별 할 수 있습니다. 이 문제를 해결하면 오류가 중지됩니다.

물론 처리하는 데이터에 실제로이 정도의 메모리가 필요할 수도 있습니다. 프로젝트에 관해서는 아무 말도하지 않았으므로 정확하게 판단하는 것은 불가능합니다. 이 경우 데이터를 분할하여 한 번에 일부만로드하고 처리하고 메모리에서 해제 한 다음 다음 데이터 묶음으로 이동하는 방법을 알아야합니다.

나는 이러한 문제를 해결하기 위해 위의 모든 기술을 사용했으며 이전에 이러한 기술을 모두 사용했습니다.

1

이클립스 내에서 실행중인 메모리 또는 응용 프로그램이 실행되고 있습니까?

메모리 누수가 아니라 더 많은 메모리가 필요하다고 가정하면 이클립스 내부에서 실행되는 응용 프로그램에 전달 된 VM 인수를 변경할 수 있습니다. 실행 구성 -> VM 인수 -> -Xmx512m

문제가 eclipse이면 설정 파일 eclipse.ini를 편집하고 -Xmx 인수를 변경할 수 있습니다.

그러나 메모리 누수가있는 경우 최대 힙 크기를 늘리면 문제가 조금 더 숨겨집니다.