`
fjguodong
  • 浏览: 39389 次
社区版块
存档分类
最新评论

java多线程应用的线程数量限制

    博客分类:
  • Java
 
阅读更多

    本人写了一个多线程的端口扫描应用程序,这个本来是在公司的电脑上跑得,4G内存,再加4G虚拟内存(内存交换空间),xp系统。在公司跑得时候还好好的,但是一拷贝到自己的电脑上跑的时候,结果发生了问题。 

#
# 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=15656, tid=7948
#
# JRE version: 6.0_45-b06
# Java VM: Java HotSpot(TM) Client VM (20.45-b01 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)

----------------------------------------------------

 

针对这个问题,从网上找到了一个有关的解决办法:

-----------------------------------------------------------------------------------------

下面是摘抄网上关于JVM线程堆栈的相关内容:

JVM线程堆栈

 应用程序中的每个线程都需要内存来存储器堆栈(用于在调用函数时持有局部变量并维护状态的内存区域)。每个 Java 线程都需要堆栈空间来运行。

 根据实现的不同,Java 线程可以分为本机线程和 Java 堆栈。除了堆栈空间,每个线程还需要为线程本地存储(thread-local storage)和内部数据结构提供一些本机内存。

 

JVM堆栈大小

-Xss 128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。

在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 

JVM heap与JVM私有内存、JVM线程堆栈大小间的关系及平衡。

线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时

时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会

出现内存溢出的错误.

-----------------------------------------------------------------------------------------

本人为了减少端口扫描所花费的时间,将线程的数量设置成了5000,在公司的电脑上跑得时候由于内存的数量足够多,而本人机子的内存不够分配,导致了上述的错误。将线程数改成3000后就没有了上面的错误。

 

多线程的应用中,最好不要分配超过3000个的线程。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics