2012-03-30 3 views
0

구성 매개 변수 높이 및 너비에 따라 int input[] 배열에 공간을 할당해야합니다. 구성의배열 초기화 중 오류 : OutOfMemoryError

int input[]=new int[height * width]; //this is line no 538 

하나는 매개 변수를 height=8192width=8192 있습니다. 배열의 크기는 67108864이됩니다. 그러나 내가 이것을 할 때 나는 OutOfMemoryError를 얻는다.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at Test.main(Test.java:538) 

이 프로그램은 cyclipse뿐만 아니라 cygwin에서도 실행했지만 동일한 문제에 직면하고 있습니다. 나는 이것이 오류가 아니라 예외는 아니라고 생각한다. 이 문제를 어떻게 해결할 수 있습니까?

+0

Java 실행 구성이란 무엇입니까? OutOfMemoryError가 발생하는 행은 중요하지 않습니다. – Markus

+1

이 내 의견을 참조하십시오 [대답] (http://stackoverflow.com/a/9937250/1251613) – Markus

답변

1

대상으로하는 크기의 배열을 보유 할 힙 공간이 너무 적을 수 있습니다. 명령 줄 스위치를 사용하여 힙의 크기를 늘릴 수 있습니다.

-Xmx256m

height * width * 4 (4의 int 바이트의 저장입니다) 곱하면 당신이의 거친 게이지를 얻을 수 있습니다 : 예를 들어,이 스위치를 포함, 256메가바이트로 설정하기 프로그램의 나머지 부분이 많은 양을 필요로하지 않는다고 가정 할 때 필요한 힙의 양. 빠른 계산이 제시하는 것보다 더 많은 힙이 필요할 것입니다. 어쩌면 20 % 여분을 더하고 그것을 밖으로 시도하십시오.

규칙 계산보다 더 나은 숫자를 얻으려면 힙 프로파일 러를 살펴볼 수 있습니다. 여러 오픈 소스 옵션이 있습니다

http://java-source.net/open-source/profilers

는 자바 힙의 좋은 토론 http://javarevisited.blogspot.com/2011/05/java-heap-space-memory-size-jvm.html를 참조하십시오.

1

힙을 증가 시키려면이 플래그를 추가하여 Java 프로세스의 메모리 인수를 늘리십시오. 힙의 최적 크기를 얻으려면 주위를 놀아야 할 수도 있습니다. 그러면 "최대"힙 크기가 설정됩니다. 기본값은 아마도 매우 작을 것입니다. 64M은 많은 Java EE 컨테이너에 대한 공통 최대 크기입니다.

*주의 꼭 필요한 크기라고 말하는 것은 아닙니다. 당신의 독특한 케이스는 당신이 실험 할 필요가있는 사이즈를 지시 할 것입니다.

-Xmx256M 
+1

그는 조금 더 필요합니다. 67108864'int'는 스스로 256M을 차지합니다. – trutheality

+0

나는 나의 대답을 편집으로 명확하게했다. 우리가 오직 기억을 필요로하는 배열 하나만을 알고 있기 때문에 "명확한"대답을 줄 수는 없습니다. 그의 프로그램이 그 배열 하나만 사용하지 않는다면, 그는 자신이 필요로하는 크기를 알아 내야 할 것입니다. – DavidB

5

8192 * 8192 * 4 = 256 M (정수 4 바이트 각각) 이후, 사용자의 행렬 자체 힙 256MB의 공간을 사용한다.

응용 프로그램에서 사용할 수있는 힙 공간을 JVM에 알릴 수 있습니다. man java을 실행하고 비표준 옵션을 찾고에서 :

-Xmxn

  Specify the maximum size, in bytes, of the memory allocation 
      pool. This value must a multiple of 1024 greater than 2MB. 
      Append the letter k or K to indicate kilobytes, or m or M to 
      indicate megabytes. The default value is chosen at runtime 
      based on system configuration. For more information, see 
      HotSpot Ergonomics 
      Examples: 

        -Xmx83886080 
        -Xmx81920k 
        -Xmx80m 

     On Solaris 7 and Solaris 8 SPARC platforms, the upper limit for 
     this value is approximately 4000m minus overhead amounts. On 
     Solaris 2.6 and x86 platforms, the upper limit is approximately 
     2000m minus overhead amounts. On Linux platforms, the upper limit 
     is approximately 2000m minus overhead amounts. 

이 옵션을 사용하려면, 당신은 이클립스에서

java -Xmxn1024m -jar foo.jar 

같은 명령을 사용하여 응용 프로그램을 시작할 것 명령 줄 옵션도 추가 할 수 있습니다. eclipse.org의 This page은 Java 프로그램에 명령 행 인수를 추가하는 f}을 설명합니다.해당 사이트에 표시된 대화 상자의 "VM 인수"섹션에 -Xmxn1024m (또는 충분히 큰 힙 사양)을 추가해야합니다.

+0

다른 유용한 [답변] (http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error-64mb-heap) – Markus

1

메모리 부족으로 프로그램에 메모리가 부족할 수 있습니다.

아래에서 시도해보십시오. 해결하지 못하면 jmx 값을 늘리십시오.

java -xmx1g -xms512m 
1

JVM의 힙 정도에 따라 다릅니다. 명령 줄에서 실행하면 -Xmx512m을 추가하십시오. IDE에서 작업하는 경우 "실행"속성에 추가하십시오.

1

int는 32 비트 (즉, 4 바이트)입니다. 따라서 배열에는 8192 * 8192 * 4 바이트가 필요합니다. 이것은 256MB로 나온다.

Java는 기본 인수로 호출 할 때 64MB의 힙 공간 만 갖습니다.

큰 힙을 얻으려면 -Xmx 인수 (최대 메모리 크기)를 사용하여 Java를 호출하십시오.

java -Xmx300M