2011-06-14 2 views
19

이 질문에 대한 업데이트는 아래를 참조하십시오.Java 6 업데이트 25 VM 크래시 : 메모리 부족

은 내가 (재현, 적어도 나를 위해) JVM 충돌을 경험 (하지 OutOfMemoryError를) (충돌 응용 프로그램 이클립스 3.6.2이다). 나는 윈도우 XP 32 비트 SP3를 사용하고

# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (malloc) failed to allocate 65544 bytes for Chunk::new 
# Possible reasons: 
# The system is out of physical RAM or swap space 
# In 32 bit mode, the process size limit was hit 
# Possible solutions: 
# Reduce memory load on the system 
# Increase physical memory or swap space 
# Check if swap backing store is full 
# Use 64 bit Java on a 64 bit OS 
# Decrease Java heap size (-Xmx/-Xms) 
# Decrease number of Java threads 
# Decrease Java thread stack sizes (-Xss) 
# Set larger code cache with -XX:ReservedCodeCacheSize= 
# This output file may be truncated or incomplete. 

Current thread (0x531d6000): JavaThread "C2 CompilerThread1" daemon 
[_thread_in_native, id=7812, stack(0x53af0000,0x53bf0000)] 

Stack: [0x53af0000,0x53bf0000], sp=0x53bee860, free space=1018k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
V [jvm.dll+0x1484aa] 
V [jvm.dll+0x1434fc] 
V [jvm.dll+0x5e6fc] 
V [jvm.dll+0x5e993] 
V [jvm.dll+0x27a571] 
V [jvm.dll+0x258672] 
V [jvm.dll+0x25ed93] 
V [jvm.dll+0x260072] 
V [jvm.dll+0x24e59a] 
V [jvm.dll+0x47edd] 
V [jvm.dll+0x48a6f] 
V [jvm.dll+0x12dcd4] 
V [jvm.dll+0x155a0c] 
C [MSVCR71.dll+0xb381] 
C [kernel32.dll+0xb729] 

: 그러나, 충돌 로그를 찾고 내가 궁금합니다. 4GB RAM이 있습니다. 응용 프로그램을 시작하기 전에 작업 관리자 (2GB 시스템 캐시가 해제되어있을 수도 있음)에 따라 2GB가 무료였습니다. 확실히 충분한 여유 RAM이 있습니다.

시작부터 충돌까지 나는 visualvm 및 jconsole을 사용하여 jvm 메모리 통계를 기록했습니다. 충돌 전 마지막 순간까지 메모리 소비 통계를 수집했습니다.

통계

는 다음의 할당 된 메모리의 크기를 보여준다

  • HEAPSIZE : 751메가바이트 (사용 2백48메가바이트)
  • 비 HEAPSIZE (PermGen & CodeCache) 1백50메가바이트 (사용 95메가바이트) 메모리 관리 영역의
  • 크기 (등 Edenspace, 올드 세대) : 350메가바이트
  • 스레드 스택 크기 S : 17메가바이트

내가 응용 프로그램을 실행하고 (JRE 6 업데이트 25, 서버 VM)를 사용하여 매개 변수 (51 개 스레드가 실행되고 있다는 사실 oracle에 의한에 따라) :

-XX:PermSize=128m 
-XX:MaxPermSize=192m 
-XX:ReservedCodeCacheSize=96m 
-Xms500m 
-Xmx1124m 

질문 :

  • 이유는 무엇입니까 VM 및 OS에 분명히 충분한 메모리가 거기에 JVM이 충돌?
    위의 설정에서 2GB 32 비트 제한 (1124MB + 192MB + 96MB + 스레드 스택 < 2GB)을 사용할 수 없다고 생각합니다. 다른 경우 (힙 할당이 너무 많음) jvm 충돌보다 OutOfMemoryError를 기대할 것입니다.

여기서 어떤 문제가 발생하는지 파악하는 데 도움을 줄 수있는 사람은 누구입니까?

(주 : 최근 Eclipse 3.4.2에서 Eclipse 3.6.2로, Java 5에서 Java 6으로 업그레이드되었습니다.내가

UPDATE

It seems to be a jvm bug이 업데이트 (25) 자바 6 도입과 함께 할 수있는 뭔가가)이 전에 보지 않았기 때문에 나는 충돌 이러한 변화 사이의 연결이있을 것으로 의심 새로운 jit 컴파일러. 또한 this blog entry. 블로그에 따르면이 버그의 수정 사항은 다음 Java 6 업데이트의 일부 여야합니다. 한편 충돌이 발생하면 기본 스택 추적을 얻었습니다. 위의 충돌 로그를 업데이트했습니다. VM의 인수를 사용

제안 된 해결 방법 -XX:-DoEscapeAnalysis 작품

+0

32 비트 공간을 지원하기에는 최대 메모리 크기를 너무 높게 설정했을 수 있습니다. 일반적으로 JVM이이를 감지하지만 감지 할 수없는 방식으로 한계에 근접 할 수 있습니다. –

+0

'PermSize'를'512m'으로 늘리고'-XX : PermSize = 512m'을 추가하면 오류가 여전히 발생합니까? –

+2

어떤 Java 6 버전입니까? 설명은 [this bug ID] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7042582)와 유사하지만 스레드 덤프는 제외됩니다. –

답변

-2

JVM이는 물리적 또는 가상 메모리 제한을 명중하기 전에 오랫동안 중단됩니다 자신의 한계가있다 (적어도이 특히 충돌의 가능성을 낮춘다) . 조정할 필요가있는 것은 -X 플래그 중 하나가있는 힙 크기입니다. (나는 그것이 -XHeapSizeLimit 같은 창조적 인 일이라고 생각하지만 난 두 번째 체크인 수 있습니다.)

Here we go :

은 메모리 할당 풀의 초기 사이즈를 바이트 수로 지정 -Xmsn. 이 값은 1024의 배수 여야합니다. 1MB보다 큽니다. 킬로바이트를 나타내려면 k 또는 K 문자를 추가하고 메가 바이트를 나타내려면 m 또는 M 문자를 추가하십시오. 기본 값은 2MB입니다. 예 :

-Xms6291456 
    -Xms6144k 
    -Xms6m 

-Xmxn 메모리 할당 풀의 최대 크기 (바이트)를 지정하십시오. 이 값은 1024의 배수 여야합니다. 2MB보다 커야합니다. 킬로바이트를 나타내려면 k 또는 K 문자를 추가하고 메가 바이트를 나타내려면 m 또는 M 문자를 추가하십시오. 기본 값은 64MB입니다. 예를 들면 :

-Xmx83886080 
    -Xmx81920k 
    -Xmx80m 
+1

-Xmx를 의미합니까? 이것이 제가 여기서 설정하는 것입니다. 그리고 게시물에 명시된 바와 같이, 나는 이론적으로 그 한계에 도달 할 수 없으며, 비록 내가 원한다고하더라도 오히려 OutOfMemoryError를 얻고 싶습니다. 그래서 이것은 불가능합니다. IMHO. – MRalwasser

+0

당신은 당신이 충돌하기 전에 마지막 샘플을보고 있기 때문에 그럴 수 없다는 것을 모릅니다. http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html을 보시고 -XX : -HeapDumpOnOutOfMemoryError를 설정하십시오. –

+0

jmap도 잘 보길 원합니다. http : //www.oracle.com/technetwork/articles/javase/monitoring-141801.html#Heap_Dump –

1

나는 직장에서 비슷한 문제를 만났다. 우리는 우리의 응용 프로그램에 대해 -Xmx65536M을 설정했지만 정확하게 동일한 종류의 오류를 계속 가져 왔습니다. 재미있는 점은 응용 프로그램이 실제로 비교적 가벼운 계산을 수행하고 상대적으로 말하면서이 오류가 항상 발생했기 때문에이 한계에 가깝지 않았습니다.

온라인 문제 : http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-unable-to-create-new-native-thread.jsp에 대한 가능한 해결책을 찾았습니다. 문제가 해결 된 것으로 보입니다. -Xmx에서 50G로 낮추면 이러한 문제가 발생하지 않습니다.

실제로 실제로 발생하는 상황은 여전히 ​​다소 불투명합니다.

+0

링크가 끊어졌습니다. – mrswadge