Недостаточно памяти для продолжения работы Java Runtime Environment.

Мое приложение Java выходит из строя после того, как оно проработало пару дней во время JIT-компиляции. Может родная память дефрагментирована, а понадобилось всего 8Кб... У меня больше 700 потоков. 2Гб кучи (при сбое jvm использовался только 1Гб) Пожалуйста, помогите решить эту проблему.

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8192 bytes for committing reserved memory.
# 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.
#
#  Out of Memory Error (os_solaris.cpp:2677), pid=25465, tid=47
#
# JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode solaris-sparc compressed oops)
# Core dump written. Default location: /location/core or core.25465
#

---------------  T H R E A D  ---------------

Current thread (0x0000000100c75000):  JavaThread "C2 CompilerThread3" daemon [_thread_in_vm, id=47, stack(0xffffffff58d00000,0xffffffff58e00000)]

Stack: [0xffffffff58d00000,0xffffffff58e00000],  sp=0xffffffff58dfcfd0,  free space=1011k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xddc994]  void VMError::report_and_die()+0x6e4
V  [libjvm.so+0x5347d4]  void report_vm_out_of_memory(const char*,int,unsigned long,VMErrorType,const char*)+0x64
V  [libjvm.so+0xb7304c]  int os::Solaris::commit_memory_impl(char*,unsigned long,bool)+0x10c
V  [libjvm.so+0xb73334]  bool os::pd_commit_memory(char*,unsigned long,unsigned long,bool)+0x2c
V  [libjvm.so+0xb66354]  bool os::commit_memory(char*,unsigned long,unsigned long,bool)+0x2c
V  [libjvm.so+0xdd756c]  bool VirtualSpace::expand_by(unsigned long,bool)+0x150
V  [libjvm.so+0x684364]  bool CodeHeap::expand_by(unsigned long)+0xc8
V  [libjvm.so+0x492038]  CodeBlob*CodeCache::allocate(int,bool)+0xa0
V  [libjvm.so+0xb1e08c]  nmethod*nmethod::new_nmethod(methodHandle,int,int,CodeOffsets*,int,DebugInformationRecorder*,Dependencies*,CodeBuffer*,int,OopMapSet*,ExceptionHandlerTable*,ImplicitExceptionTable*,AbstractCompiler*,int)+0x2d0
V  [libjvm.so+0x3ec93c]  void ciEnv::register_method(ciMethod*,int,CodeOffsets*,int,CodeBuffer*,int,OopMapSet*,ExceptionHandlerTable*,ImplicitExceptionTable*,AbstractCompiler*,int,bool,bool,RTMState)+0x524
V  [libjvm.so+0x4b6c90]  Compile::Compile(ciEnv*,C2Compiler*,ciMethod*,int,bool,bool,bool)+0x1380
V  [libjvm.so+0x3b4898]  void C2Compiler::compile_method(ciEnv*,ciMethod*,int)+0xa8
V  [libjvm.so+0x4d02b8]  void CompileBroker::invoke_compiler_on_method(CompileTask*)+0xeb0
V  [libjvm.so+0x4cebf8]  void CompileBroker::compiler_thread_loop()+0x490
V  [libjvm.so+0xd2611c]  void JavaThread::thread_main_inner()+0x94
V  [libjvm.so+0xd26068]  void JavaThread::run()+0x398
V  [libjvm.so+0xb6dcb0]  java_start+0x390
C  [libc.so.1+0xe2464]  _lwp_start+0x8

person Mark Vilkel    schedule 24.08.2015    source источник
comment
возможный дубликат сбоя Tomcat: Недостаточно памяти для продолжения среды выполнения Java   -  person e4c5    schedule 24.08.2015


Ответы (2)


Я не знаю насчет Solaris, но в Linux есть sysctl vm.max_map_count, который ограничивает максимальное количество отображений виртуальной памяти.

Таким образом, хотя свободного физического ОЗУ и виртуального адресного пространства может быть достаточно, количество разрешенных сопоставлений может исчерпаться.

person the8472    schedule 24.08.2015

Проблема в том, что операционная система сообщила, что ей не хватает виртуальной памяти. Я бы посмотрел, сколько свободного пространства подкачки у вас есть, и рассмотрел бы возможность его увеличения.

Один из способов предоставить системе больше свободного пространства подкачки — это уменьшить размер кучи, если вы не используете ее всю.

Примечание: ГБ = гигабайты, ГБ = гигабиты.

person Peter Lawrey    schedule 24.08.2015
comment
ОС: Oracle Solaris 11 11/11 SPARC Copyright (c) 1983, 2011, Oracle и/или ее филиалы. Все права защищены. Собран 18 октября 2011 г. uname: SunOS 5.11 11.0 sun4v (T2 libthread) rlimit: STACK 8192k, CORE infinity, NOFILE 65536, средняя нагрузка AS infinity: 11,03 11,16 10,38 ЦП: всего 32 v9, popc, vis1, vis2, blk_init, sun4v, niagara Память: 8k страниц, физическая 16646144k (3133616k свободно) - person Mark Vilkel; 24.08.2015
comment
Памяти на тот момент вроде хватило - 3133616k свободно в hs_err_pid25465.log - person Mark Vilkel; 24.08.2015
comment
Место подкачки 2 гигабайта - person Mark Vilkel; 24.08.2015
comment
@MarkVilkel в любом случае операционная система сообщает об ошибке нехватки памяти, использование кучи не имеет значения. Возможно, вместо этого вы достигаете предела ресурсов для процесса. что вы видите для ulimit -a? - person Peter Lawrey; 24.08.2015
comment
размер основного файла (блоки, -c) неограниченный размер сегмента данных (кбайт, -d) неограниченный размер файла (блоки, -f) неограниченное количество открытых файлов (-n) 256 размер канала (512 байт, -p) 10 размер стека (кбайт , -s) 8192 процессорное время (секунды, -t) неограниченное количество пользовательских процессов (-u) 29995 виртуальная память (кбайт, -v) неограниченное - person Mark Vilkel; 24.08.2015