이 질문에 대한 업데이트는 아래를 참조하십시오.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
작품
32 비트 공간을 지원하기에는 최대 메모리 크기를 너무 높게 설정했을 수 있습니다. 일반적으로 JVM이이를 감지하지만 감지 할 수없는 방식으로 한계에 근접 할 수 있습니다. –
'PermSize'를'512m'으로 늘리고'-XX : PermSize = 512m'을 추가하면 오류가 여전히 발생합니까? –
어떤 Java 6 버전입니까? 설명은 [this bug ID] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7042582)와 유사하지만 스레드 덤프는 제외됩니다. –