天天看點

java jvm 線程數_Java:JVM可建立的最大線程數 & JVM線程堆棧

一天,程式崩潰:

#

# 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線程堆棧大小間的關系及平衡。

線程棧的大小是個雙刃劍,如果設定過小,可能會出現棧溢出,特别是在該線程内有遞歸、大的循環時

時出現溢出的可能性更大,如果該值設定過大,就有影響到建立棧的數量,如果是多線程的應用,就會

出現記憶體溢出的錯誤.