一天,程式崩潰:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
# 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 (allocation.cpp:211), pid=3696, tid=3704
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) Client VM (20.1-b02 mixed mode, sharing windows-x86 )
------------------------------------------------下面是用google翻譯的
#有針對Java運作環境繼續記憶體不足。
#本機記憶體配置設定(malloc的)未能配置設定ChunkPool32756位元組:配置設定
#可能的原因:
#該系統是出了實體RAM或交換空間
#在32位模式下,程序大小限制被擊中
#可能的解決方案:
#減少記憶體系統上的負載
#增加實體記憶體或交換空間
#檢查交換後備存儲已滿
#使用64位作業系統上的64位Java
#減少Java堆大小(-Xmx/-Xms)
#減少Java的線程數
#減少Java線程堆棧大小(- XSS)**********
#設定更大的代碼緩存使用- XX:ReservedCodeCacheSize=
#這個輸出檔案可能被截斷或不完整的。
#
#記憶體不足的錯誤(allocation.cpp:211),PID=3696,TID=3704
#
#JRE版本:6.0_26- B03
#Java虛拟機:的Java HotSpot(TM)用戶端虛拟機(20.1- B02混合模式,共享視窗- X86)
----------------------------------------------------
我看了一下日志,線程數在3000多個,我了解的也是這樣,當線程超過3000多的時候,就出記憶體問題。
下面是摘抄網上關于JVM線程堆棧的相關内容:
JVM線程堆棧
應用程式中的每個線程都需要記憶體來存儲器堆棧(用于在調用函數時持有局部變量并維護狀态的記憶體區域)。每個 Java 線程都需要堆棧空間來運作。
根據實作的不同,Java 線程可以分為本機線程和 Java 堆棧。除了堆棧空間,每個線程還需要為線程本地存儲(thread-local storage)和内部資料結構提供一些本機記憶體。
JVM堆棧大小
-Xss 128k:設定每個線程的堆棧大小。JDK5.0以後每個線程堆 棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需記憶體大小進行調整。
在相同實體記憶體下,減小這個值能生成更多的線程。但是作業系統對一 個程序内的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
JVM heap與JVM私有記憶體、JVM線程堆棧大小間的關系及平衡。
線程棧的大小是個雙刃劍,如果設定過小,可能會出現棧溢出,特别是在該線程内有遞歸、大的循環時
時出現溢出的可能性更大,如果該值設定過大,就有影響到建立棧的數量,如果是多線程的應用,就會
出現記憶體溢出的錯誤.