2011-03-31 8 views
11

Tomcat이이 쿼리를 대신 던져 버릴 수있는 로그 옵션이 있습니까?Java에서 "요청 된 배열 크기가 VM 제한을 초과합니다"오류를 해결하는 방법?

SEVERE: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

(FULL하려고 로그 수준,하지만 위의 캡처)이 다음과 같은 조정에 의해 할당 된 메모리에 의해 해결 될 수있는 경우

이 또는 더 디버그
에 대한 충분한 정보가 아니다?

-Xms1024M -Xmx4096M -XX:MaxPermSize=256M

업데이트

-Xms6G -Xmx6G -XX:MaxPermSize=1G -XX:PermSize=512M

(모니터링을 지키는 위, 더 나은 작품을 보인다)

+0

'-mx8g' 또는'-mx16g'을 시도해 볼 수 있습니까? 얼마나 많은 기억이 있니? 이 문제가있는 서버의 경우 –

+0

은 8G – ajreal

+1

입니다.'-mx6g' 또는'-Xmx6g'을 시도 할 것입니다 (smae를 수행하십시오). 그러나 이것으로는 아무런 차이가 없습니다. 힙 덤프를 분석 할 도구가 있다면'-XX : + HeapDumpOnOutOfMemoryError'를 시도해 볼 수도 있습니다. –

답변

0

업그레이드 SOLR 신청 배열의 힙 공간의 256M로, 힙 공간의 크기를 초과하기 때문입니다 최신 버전으로 정렬이 문제가 보인다, 가능성이 최신 버전은 더 나은 힙 메모리 관리가 있습니다.

9

난 당신이 큰 인덱스 종류를 사용하고있을 수 있습니다 생각한다. 그것은 내가 Lucene과 함께 큰 배열 크기를 요구할 수 있다는 것을 확실히 알고 있습니다. 어느 쪽이든, 당신은 이러한 옵션이있는 64 비트 JVM을 사용하여 시도 할 수 있습니다 :

-Xmx6G -XX:MaxPermSize=128M -XX:+UseCompressedOops 

32 비트 64 비트 메모리 포인터를 줄일 마지막 옵션 (긴으로 힙이 32기가바이트 아래). 이렇게하면 일반적으로 메모리 오버 헤드가 약 40 % 감소하므로 메모리를 크게 늘릴 수 있습니다.

업데이트 : 대개 1G가 아닌 큰 영구 세대 크기가 필요합니다. 당신은 아마 괜찮아요 128M, 그리고 당신은 특정 오류가 발생하면 Java 6으로 이동합니다. 서버에서 8G로 제한되어 있기 때문에 당신은 더 작은 파마로 힙에 대한 7G로 떠날 수있을 수도 있습니다 gen. 스왑에 들어 가지 않도록 조심하십시오. Java에서 심각하게 느려질 수 있습니다.

업데이트에 -XX:+UseCompressedOops을 언급하지 않은 것으로 나타났습니다. 당신이 아직 시도하지 않았다면 그것은 큰 차이를 만들 수 있습니다. 낡은 세대에 더 많은 공간을 제공하기 위해 에덴의 크기를 줄임으로써 조금 더 많은 공간을 쥘 수있을 것입니다. 그 외에도 메모리 또는 정렬 필드가 더 필요할 것입니다.

0

은 내가 30M 작은 문서로 SOLR 톰캣 /에 MEM 문제가 없었 catalina.sh

JAVA_OPTS="-Dsolr.solr.home=/etc/tomcat6/solr -Djava.awt.headless=true -server -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC" 

이를 사용합니다. 클라이언트를 인덱싱하는 solrJ에 문제가있었습니다. Java 클라이언트에 -Xms8G -Xmx8G을 사용하고 문서를 250,000 개의 청크별로 추가해야했습니다. 당신이에 OutOfMemory 원인이 무엇인지 찾으려면

2

, 당신은 당신의 자바 OPTS에

-XX:+HeapDumpOnOutOfMemoryError 

를 추가 할 수 있습니다.

다음에 메모리가 부족 해지면 jdk/lib 안에있는 "jhat"로 분석 할 수있는 힙 덤프 파일이 생성됩니다. Jhat은 힙에 어떤 객체가 있는지 그리고 얼마나 많은 메모리를 소비하는지 보여줍니다.

+0

이전에는이 ​​옵션을 사용하지 않았지만 해당 옵션을 사용할 수 없으면 tomcat이 옵션에 정의되지 않은 오류를 표시합니다 – ajreal

0

메모리 부족! 범위를 벗어나는 배열이 있는지 확인하거나 시스템 리소스를 삼킨 루프를보십시오!


1java.lang.OutOfMemoryError : Java 힙 공간 JVM에서 GC 힙 크기에 98 %의 시간을 사용할 수 있고이 예외 정보를 처리 할 시간의 2 % 미만인 경우. JVM 힙 설정은 JVM 메모리 공간을 실행중인 Java 프로그램이 설정을 배포하는 데 사용될 수 있습니다. JVM은 힙 크기 값을 자동으로 설정합니다. 초기 공간 (예 : -Xms)은 1/64의 물리적 메모리입니다. 최대 공간 (-Xmx)은 1/4의 물리적 메모리입니다. Xmn-Xms-Xmx 및 기타 옵션을 설정할 수 있습니다.

2.Requested 배열의 크기는 VM 제한을 초과 : 배열 크기의 응용 프로그램이 이러한 512M

1

Java VM 힙에서 최대 연속 메모리 블록보다 큰 배열을 작성하려고하기 때문에이 예외가 발생합니다.

https://plumbr.eu/outofmemoryerror/requested-array-size-exceeds-vm-limit

해결책은 무엇인가?

java.lang.OutOfMemoryError와 : 요청 배열 크기는 VM의 한계는 다음과 같은 상황 중 하나의 결과로 나타날 수 초과 :

당신의 배열이 너무 큰 성장하고 플랫폼의 한계 사이의 크기의 끝과 Integer.MAX_INT

의도적으로 2^31-1보다 큰 배열을 할당하여 시도해보십시오.

첫 번째 경우에는 코드베이스를 검사하여 큰 배열이 필요한지 확인하십시오. 어쩌면 배열의 크기를 줄이고 배열의 크기를 줄일 수 있습니다. 또는 어레이를 더 작은 벌크로 나누고 작업해야하는 데이터를 플랫폼 한도에 맞는 일괄 처리로로드하십시오.

두 번째 경우 - Java 배열은 int로 인덱싱됩니다. 따라서 플랫폼 내의 표준 데이터 구조를 사용할 때 배열의 2^31-1 요소를 넘을 수 없습니다. 사실,이 경우에는 컴파일 중에 "error : integer number too large"라고 알리는 컴파일러에 의해 이미 차단되었습니다. 그러나 실제로 큰 데이터 세트로 작업하는 경우 옵션을 재고해야합니다. 더 작은 배치로 작업해야하는 데이터를로드하고 표준 Java 도구를 계속 사용하거나 표준 유틸리티를 넘을 수도 있습니다. 이를 달성하는 한 가지 방법은 sun.misc.Unsafe 클래스를 살펴 보는 것입니다. 이렇게하면 C와 같이 직접 메모리를 할당 할 수 있습니다.

관련 문제