Обновление этого вопроса - см. Ниже.
Я испытываю (воспроизводимый, по крайней мере для меня) jvm сбой ( не OutOfMemoryError ) (сбой приложения - затмение 3.6.2).Однако, глядя на журнал сбоев, я удивляюсь:
#
# 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]
Я использую Windows XP 32-bit SP3.У меня 4 ГБ оперативной памяти.Перед запуском приложения у меня было 2 ГБ свободного места в соответствии с диспетчером задач (+ 1 ГБ системного кэша, который также может быть освобожден).У меня определенно достаточно свободной оперативной памяти.
С самого начала и до сбоя я регистрировал статистику памяти jvm с помощью visualvm и jconsole.Я получил статистику потребления памяти до последних мгновений до сбоя.
Статистика показывает следующие выделенные размеры памяти:
- Размер кучи: 751 МБ (используется 248 МБ)
- Non-HeapSize (PermGen & CodeCache): 150 МБ (используется 95 МБ)
- Размер областей управления памятью (Edenspace, Old-gen и т. Д.): 350 МБ
- Размеры стека потоков: 17 МБ (в соответствии с oracle и из-за того, что запущен 51 поток)
Я запускаю приложение (jre 6 update 25, vm сервера), используя параметры:
-XX:PermSize=128m
-XX:MaxPermSize=192m
-XX:ReservedCodeCacheSize=96m
-Xms500m
-Xmx1124m
Вопрос:
- Почему происходит сбой jvm, когда на виртуальной машине и операционной системе явно достаточно памяти?
При указанных выше настройках я думаю, что не могу достичь 32-битного предела в 2 ГБ (1124 МБ + 192 МБ + 96 МБ + потокстеки <2 ГБ).В любом другом случае (слишком большое выделение кучи) я предпочел бы ожидать ошибку OutOfMemoryError, а не аварию jvm </li>
Кто может помочь мне выяснить, что здесь происходит не так?
(Примечание: я недавно обновился до Eclipse 3.6.2 с Eclipse 3.4.2 и с Java 5 до Java 6. Я подозреваю, что существует связь между сбоями и этими изменениями, потому что я не видел их раньше)
ОБНОВЛЕНИЕ
Кажется, что это ошибка jvm , представленная в Java 6 Update 25 и есть чем занятьсяс новым JIT-компилятором.См. Также эту запись в блоге. Согласно блогу, исправление этой ошибки должно быть частью следующего обновления Java 6.Тем временем я получил трассировку собственного стека во время сбоя.Я обновил приведенный выше журнал сбоев.
Предложенный обходной путь с использованием аргумента vm -XX:-DoEscapeAnalysis
работает (по крайней мере, он заметно снижает вероятность сбоя)