2010-12-29 5 views
0

코드를 작성했는데 크기가 다른 일부 목록을 전달하려고하지만 내 목록 크기가 1024를 넘으면 예외가 발생합니다! 내가 어떻게 처리 할 수 ​​있니?메모리 부족 오류

size, running time for x 

2,184073 
3,98308 
5,617257 
9,481714379 
17,55230 
33,64505 
65,41094 
129,65120 
257,102555 
513,197511 
1025,465897 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at OBSTclasses.MemoizedVersion.<init>(MemoizedVersion.java:33) 
     at OBSTclasses.Coordinator.main(Coordinator.java:102) 
Java Result: 1 

와이 예외를 throw 라인은 다음과 같습니다

 minAverageTimeArray = new double[array.size()][array.size()]; 

감사

+0

또한 netbeans IDE 6.7을 사용합니다. – user472221

+0

이러한 단서에서 나는 알고리즘 변경에 대한 heapsize를 늘려야한다고 말할 수 있습니다. – pinichi

답변

2

이 자바 프로세스에서 사용할 수있는 최대 메모리 양을 늘려야하는 것처럼 들립니다. java 호출에 -Xmx512m과 같은 매개 변수를 추가하십시오. 여기서 512m은 512 메가 바이트를 의미합니다.

3

malfy's answer은 메모리가 부족한 방법을 찾지 않고 JVM이 힙에 더 많은 메모리를 할당하도록 지시하여 힙 공간을 늘리는 것 외에 상황을 처리하는 방법 중 하나입니다.

일반적으로 OutOfMemoryError과 같은 Error에 대한 오류 처리를 수행하면 안됩니다. Exception과 반대로 Error은 JVM에 의해 발생되는 조건으로, JVM에 치명적인 문제가 발생했음을 나타냅니다. 이는 프로그램 자체에서 진정으로 "처리 할 수없는"문제입니다. Java API Specification for the Error 클래스에서

:

있는 오류는 의 어플리케이션으로 캐치해서는 안되는 중대한 문제를 나타냅니다의 Throwable 의 서브 클래스입니다. 대부분의 이러한 오류는 비정상적인 조건입니다.

그래서, 간결하게 질문에 대답하기 위해, 당신은 OutOfMemoryError 오류 처리 할 수 ​​있지만, 첫 번째 장소에서 발생하는 Error을 피할 수있는 방법을 찾을 것이다. 에서 OutOfMemory 오류의

0

가능한 이유는 메모리가
솔루션 누출 될 수 있습니다 : 자바에서 오류를 처리하지 않을 것을 coobird으로 다음 명령

Usage :: java -Xms<initial heap size> -Xmx<maximum heap size>
Defaults are:java -Xms32m -Xmx128m
Other values might be java -Xms128m -Xmx512m
-Xms - Initial Heap Size.
-Xmx - Extended(Maximum) Heap Size. m-megabytes

0

를 사용하여 힙 크기를 증가 . MAT (Memory Analyzer - http://www.eclipse.org/mat/)를 사용하여 메모리 누수가 실제로 있는지 또는 힙 메모리가 JVM보다 적은지 확인할 수 있습니다. 메모리 누출의 경우 MAT 결과를 사용하여 메모리 풋 프린트를 최적화 할 수 있습니다. 그렇지 않으면 위에서 언급 한 것처럼 많은 친구가 힙 크기를 늘릴 수 있습니다.

0

네, 힙 공간은 괜찮습니다. 기본적으로 Java는 대부분의 플랫폼에서 128MB를 힙에 할당합니다. 처리 할 의사가있는 최대 목록 크기와 필요한 메모리 양을 고려해야합니다. 이런 식으로 생각해 보라. 자바에서 double 타입의 변수는 대개 8 바이트 길이이다. 목록의 길이가 1024 인 경우 2D 배열은 배열 자체에 대해 8 * 1024 * 1024 바이트 또는 8MB의 힙 공간이 필요합니다. 이제 목록의 길이가 두 배라면 힙의 4 배 (32MB)가 필요하며 다시 두 배가되면 (4096 점) 힙 공간이 128MB 모두 필요합니다!이것은 물론 프로그램에 의해 생성 된 다른 객체가 사용하는 모든 힙을 무시합니다.

그래서 몇 가지 대답이 있습니다. 다른 사람들이 말했듯이, JVM 인스턴스가 사용할 최대 힙을 늘리는 것이 가장 쉽습니다. 또한 한 번에 프로그램에 필요한 메모리 양을 줄이는 것도 고려해야합니다. 모든 데이터를 저장하지 않고 계산할 수있는 평균 또는 평균 합계가 있습니까? 또는 목록과 배열로 데이터를 저장할 필요가 없습니까? 데이터의 정밀도를 낮출 수 있습니까? 부동 소수점 또는 정수가 응용 프로그램의 두 배만큼 정확합니까?