一天,程序崩潰:windows
#
# 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多的時候,就出內存問題。google
下面是摘抄網上關於JVM線程堆棧的相關內容:spa
JVM線程堆棧操作系統
應用程序中的每一個線程都須要內存來存儲器堆棧(用於在調用函數時持有局部變量並維護狀態的內存區域)。每一個 Java 線程都須要堆棧空間來運行。線程
根據實現的不一樣,Java 線程能夠分爲本機線程和 Java 堆棧。除了堆棧空間,每一個線程還須要爲線程本地存儲(thread-local storage)和內部數據結構提供一些本機內存。翻譯
JVM堆棧大小
-Xss 128k:設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆 棧大小爲1M,之前每一個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。
在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一 個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。
JVM heap與JVM私有內存、JVM線程堆棧大小間的關係及平衡。
線程棧的大小是個雙刃劍,若是設置太小,可能會出現棧溢出,特別是在該線程內有遞歸、大的循環時
時出現溢出的可能性更大,若是該值設置過大,就有影響到建立棧的數量,若是是多線程的應用,就會
出現內存溢出的錯誤.