我试图启动红帽企业Linux服务器版本6.5(圣地亚哥),这是失败,因为它不能分配足够的内存的过程。
# There is insufficient memory for the Java Runtime Environment to continue. # Cannot create GC thread. Out of system resources. # An error report file with more information is saved as:
问题不在于Java应用程序本身 – 当我简单地运行时,我也遇到了错误:
java -version
看内存消耗:
免费-m
total used free shared buffers cached Mem: 32069 31276 792 0 556 16948 -/+ buffers/cache: 13771 18297 Swap: 9325 38 9287
因此,Mem报告说使用了32GB内存中的31个,但应该有18Gb的可用内存被caching使用。 当进程请求内存时,操作系统是否应该释放这些内存?
错误转储的详细信息是
# # There is insufficient memory for the Java Runtime Environment to continue. # Cannot create GC thread. Out of system resources. # 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 (gcTaskThread.cpp:46), pid=40816, tid=140071992215296 # # JRE version: 6.0_26-b03 # Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops) --------------- THREAD --------------- Current thread (0x00007f6508006800): JavaThread "Unknown thread" [_thread_in_vm, id=40817, stack(0x00007f650d46c000,0x00007f650d56d000)] Stack: [0x00007f650d46c000,0x00007f650d56d000], sp=0x00007f650d56b7c0, free space=1021k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0x85ebd5] VMError::report_and_die()+0x265 V [libjvm.so+0x3e41b8] report_vm_out_of_memory(char const*, int, unsigned long, char const*)+0x68 V [libjvm.so+0x466ada] GCTaskThread::GCTaskThread(GCTaskManager*, unsigned, unsigned)+0x13a V [libjvm.so+0x4655de] GCTaskManager::initialize()+0x21e V [libjvm.so+0x465373] GCTaskManager::GCTaskManager(unsigned)+0x13 V [libjvm.so+0x722cad] ParallelScavengeHeap::initialize()+0x4dd V [libjvm.so+0x836549] Universe::initialize_heap()+0xa9 V [libjvm.so+0x8360ea] universe_init()+0x7a V [libjvm.so+0x4ac53b] init_globals()+0x4b V [libjvm.so+0x81cc74] Threads::create_vm(JavaVMInitArgs*, bool*)+0x214 V [libjvm.so+0x51a7b0] JNI_CreateJavaVM+0x80
看看jvm min max内存,你使用任何web服务器吗? 看看它的数量,为它的内存设置 – 对于Tomcat大多数是@ server.xml。 查看Java Mission Control http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html以获得更多信息。 Linux通常会在需要时保留更多的内存。 对于Linux上的Java,只有像JMC这样的东西可以帮助您了解正在发生的事情。 看看JVM的标准输出。
似乎这个问题与记忆没有任何关系,但是具有过程限制。 我正在运行该进程的用户具有设置为1024的非常低的进程限制。
ulimit -u 1024
并且该用户运行的所有进程的线程数接近于:
ps -eLf | grep 'myuser' | wc -l 1022