`
sxpyrgz
  • 浏览: 72449 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM最大线程数计算方法

    博客分类:
  • java
阅读更多

最近在应用服务器跑压力测试过程当中,出现无法创建线程的错误。
在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread.这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。


那么是什么原因造成这种问题呢?

每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。

这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。

给出一个有关能够创建线程的最大个数的估算公式:


(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads


对于jdk1.5而言,假设操作系统保留120M内存:
1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads

对于栈大小为256KB的jdk1.4而言,
1.5GB allocated to JVM: ~1520 threads
1.0GB allocated to JVM: ~3520 threads

如果我没有记错的话,在2000/XP/2003里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。

转自:http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html

补充:

在ubuntu 32bit中,一般只能识别3.2G或者只是3G的内存,在使用-server内核后,可以识别大于4G的内存.
32位系统(如XP 32bit,windows2003 32bit 等MS32位系统, ubuntu等linux32 位系统)要能利用4G内存,都是采用内存重映射技术。需要主板及系统的支持。如果关闭主板BIOS的重映射功能,系统将不能利用4G内存,可能只达3.5G.
32位系统,打开内存得映射功能后,系统将不能使用休眠功能(休眠与待机不同)。
为什么只支持4G?32位系统的寻址空间为2 32次方,4294967296字节,一共是4G。
相反64位的是2 64次方,算下来是4G个G,太大了。所以,如果内存大于4G的话,最好是选用64位的操作系统。这样可以充分利用内存。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mudalu626/archive/2011/05/09/6406295.aspx

分享到:
评论

相关推荐

    JVM+多线程.pdf

    每当方法执行时,JVM就会在栈中创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - **方法区(Method Area)**:用于存储已被虚拟机加载的类信息、常量、静态变量等数据。...

    用三个线程分别计算平均值,最大值,最小值Java

    本示例中,我们探讨的是如何利用三个线程分别计算一个数组中的平均值、最大值和最小值。这样的设计可以充分利用多核处理器的并行处理能力,使得计算过程更加高效。 首先,我们需要创建三个静态类,每个类代表一个...

    JavaJVM线程调优.pdf

    总的来说,Java JVM线程调优需要综合考虑线程栈大小、锁优化策略以及并发同步方法,以适应不同的应用场景。理解这些概念并根据实际情况调整参数,可以显著提升多线程程序的性能。在进行调优时,应结合监控工具分析...

    java进阶提高学习教程-13JVM与多线程.pptx

    - **问题描述**:多线程技术用于提高程序执行效率,尤其是在I/O密集型或计算密集型任务中。 - **原理和状态**:CPU通过时间片轮转的方式在多个线程间切换,造成并发执行的错觉。线程状态包括新建、就绪、运行、阻塞...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    内存管理涉及JVM内存区域,包括堆、栈、方法区、程序计数器和本地方法栈,每部分都有其特定的用途和管理方式。 2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。...

    jvm视频及笔记

    9. **栈帧与操作数栈**:每个线程都有一个独立的虚拟机栈,栈帧是方法执行的内存模型,操作数栈用于存储计算过程中的中间结果。 10. **异常处理**:JVM如何处理运行时异常,以及栈展开的过程。 11. **线程并发**:...

    jvm 详细介绍,了解jvm各个组成部分和功能

    堆是 JVM 管理的最大一块内存区域,主要用于存储对象实例以及数组等数据类型。JVM 的堆空间可以根据实际需求动态调整大小,从而更好地适应程序运行时的变化情况。 为了提高内存分配效率,JVM 通常会采用一些优化...

    jvm-mon基于控制台的JVM监视

    虽然`jvm-mon`提供了基本的JVM监控功能,但更复杂的性能问题可能需要结合其他专业工具,如JProfiler、VisualVM、YourKit等,它们提供更深入的分析和故障排查能力,如方法调用时间线、内存分配跟踪、线程栈深度等。...

    Dubbo线程模型(结合Linux线程数限制配置的实战经验分享).docx

    2. **计算普通用户的线程数限制**:线程数限制可以根据系统总内存来计算,一般推荐为总内存的1/128。例如,如果系统总内存为5993104KB(5.75GB),那么可以设置为5993104 / 128 = 46700个线程。 3. **使用`ulimit`...

    JVM内幕:java虚拟机详解

    - 操作数栈用于暂存中间结果,支持方法内表达式的计算。它是一个后进先出的数据结构,在执行字节码指令时用于存放临时变量和操作结果。 8. **动态链接(Dynamic Linking)** - 动态链接是指方法调用时确定目标方法...

    深入理解jvm虚拟机

    JVM在执行多线程时,通过线程调度器对线程进行调度。同时提供了synchronized关键字和java.util.concurrent包来实现线程之间的同步和协作。 为了深入学习和理解JVM的原理,可以参考诸如《深入理解Java虚拟机》这样的...

    gp-jvm-visualvm

    堆栈溢出(Stack Overflow)是程序运行时常见的错误,通常发生在当一个函数或方法的递归调用过深,导致调用栈超过其最大容量时。在Java中,每个线程都有自己的调用栈,用于存储方法调用的状态。当堆栈空间不足时,就...

    jvm特性与java特性

    JVM的性能优化还包括对方法内联、逃逸分析等技术的应用。 5. 线程模型:JVM提供了一套标准的线程模型,使得Java程序能够利用多线程来执行并发任务。JVM的线程模型与操作系统的本地线程直接映射,这有助于更好地利用...

    JVM技术培训讲座

    - **ThreadStack溢出**:如果线程创建过多,超出操作系统允许的最大数量,则可能导致Thread Stack溢出。 - **方法区溢出**:当方法区无法容纳更多的类信息或其他元数据时,会发生方法区溢出。 - **本机直接内存溢出*...

    jvm原理及调优

    它主要用于存储局部变量、操作数栈、动态链接、方法出口等信息。栈帧(Stack Frame)是JVM栈的基本单位,用于保存方法执行时的信息。 ##### 3.3 堆(Heap) 堆是所有线程共享的内存区域,主要用于存储对象实例和数...

    监测JVM各项性能指标

    - **CPU使用率**:过高可能会提示存在性能问题,如过度使用CPU资源的线程或计算密集型操作。 - **方法剖析**:确定哪些方法占用了最多的CPU时间,以便进行优化。 5. **网络监控** - **网络吞吐量**:了解JVM应用...

    JVM调优实践 ⼀、JVM调优准备⼯作 实验报告 pdf

    栈帧中包含局部变量表(存储方法中的变量,基本类型直接存储,对象引用存储其地址),操作数栈(用于方法内部变量的计算),动态连接(存储方法调用的引用),以及方法返回地址(用于方法结束后的返回)。...

    java虚拟机JVM详解ppt

    Java虚拟机栈是线程私有的,用于存储方法执行的局部变量表、操作数栈、动态链接等信息。当线程请求的栈深度超过JVM允许的深度时,会抛出`StackOverflowError`异常;当JVM无法再扩展栈时,会抛出`OutOfMemoryError`...

    jvm瓶颈定位 java jvm 学习

    - 栈帧:每个方法调用对应一个栈帧,包含局部变量表、操作数栈、动态链接和方法出口信息。 - 直接内存:不在JVM堆中的内存区域,使用Native Memory API直接分配。 3. **JVM性能监控与调优工具** - JConsole:...

    JVM必知必会

    - **运行时数据区**:是JVM在运行期间,用于存储数据的内存区域,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。 #### 6. 内存模型中的重要概念 - **方法区**:存储已被虚拟机加载的类信息、常量、静态变量等...

Global site tag (gtag.js) - Google Analytics