`

JVM最大线程数

    博客分类:
  • JAVA
阅读更多
http://hllvm.group.iteye.com/group/wiki/2861-JVM

JavaSE6.0 Web Servic
http://www.iteye.com/topic/166314

Web Service
http://www.iteye.com/search?type=all&query=Web+Service

Java中OutOfMemoryError
     与unable to create new native thread(JVM创建大量线程)的关系


最近在应用服务器跑压力测试过程当中,出现无法创建线程的错误。
在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创建更多的线程。
分享到:
评论

相关推荐

    WAS性能调优对jvm、线程数、ORB大小的配置

    合理设定最大线程数(-XX:MaxThreads)和最小线程数(-XX:InitialThreadCount),可以确保系统资源的高效利用。 2. **请求队列长度**:当线程池满时,新的请求会被放入队列等待。设置适当的队列长度可以防止拒绝服务。 ...

    jvm支持最大线程数简单测试

    jvm支持最大线程数简单测试 jvm支持最大线程数简单测试是非常重要的知识点,下面将详细介绍该知识点。 1. JVM支持的最大线程数 jvm支持的最大线程数是受多种因素影响的,包括java堆内存大小、Thread的Stack内存...

    针对WAS6.1,对线程数、jvm,日志以及数据库连接进行性能调优

    在本文中,我们将讨论针对 WAS 6.1 的性能调优策略,涉及到线程数、JVM、日志和数据库连接等方面的优化。 一、线程数优化 在 WAS 6.1 中,线程数的设置对性能的影响非常大。我们可以通过设置 Web Container 的最大...

    tomcat7安装使用及jvm连接数参数调优

    其中,maxThreads="600" 指定了最大线程数为 600,minSpareThreads="100" 指定了初始化时创建的线程数为 100,maxSpareThreads="500" 指定了一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程,...

    Weblogic提高并发处理性能的设置

    本文将详细介绍通过调整Weblogic线程数、设置JDBC缓冲池以及修改`startWeblogic.cmd`文件来实现这一目标的方法。 #### 1. 设置Weblogic线程数 在Weblogic服务器中,线程数直接影响到服务器能够同时处理请求的能力...

    Java面试JVM+多线程重点突破.zip

    理解核心线程数、最大线程数、线程存活时间等参数的意义。 8. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和 Phaser(阶段器)等,它们在多线程编程中提供了灵活...

    JBOSS\Tomcat最大连接数配置和jvm内存配置.docx

    `maxThreads`参数定义了服务器可以同时处理的最大线程数,即并发请求的最大数目。`acceptCount`参数则表示当达到`maxThreads`时,服务器还能接受并放入队列等待处理的连接数。适当调整这两个参数可以有效缓解服务器...

    JVM-Tomcat线程-数据库连接池设置建议.docx

    建议设置为最大线程数的70%-80%,即 `maxThreads * 0.7-0.8`。 - **`maxConnections`**:最大连接数。建议设置为CPU核心数乘以10再乘以200,即 `maxThreads * 200`。 - **`acceptCount`**:指定当所有可以使用的...

    设置Eclipse的JVM参数

    - **-Xmx712m**:设置JVM的最大堆内存大小为712MB。这是JVM运行过程中堆内存能够动态扩展的最大值。合理设置最大堆内存可以避免因内存不足而导致的OutOfMemoryError错误。 - **-XX:MaxPermSize=128m**:设置永久代...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    此外,JVM的线程配置参数如“-Xss”设置每个线程的栈大小,对多线程应用的性能有直接影响。而“-XX:ParallelGCThreads”和“-XX:ConcGCThreads”分别控制并行和并发垃圾收集的线程数量,调整这两个参数可以优化垃圾...

    JVM内存配置优化

    - **`maxThreads`**:最大线程数,表示服务器可以同时处理的最大并发请求的数量。 - **`minSpareThreads`**:最小空闲线程数,即至少保持的未使用的线程数量。 - **`maxSpareThreads`**:最大空闲线程数,当活动线程...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    - **ThreadPoolExecutor的定制**:可配置核心线程数、最大线程数、任务队列、拒绝策略等。 - **线程的中断与任务的取消**:线程中断标志的使用,以及Future的cancel方法来取消任务。 随着硬件的演进,开发者面临...

    多线程、JVM复习&面试&强化训练100题

    例如,核心线程数、最大线程数、工作队列的容量等参数的选择,会影响到应用的性能和资源利用率。 单例模式是一种常见的设计模式,它用于确保一个类只有一个实例,并提供一个全局访问点。单例的实现方法多种多样,如...

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

    3. **使用`ulimit`命令查看和调整限制**:`ulimit -a`可以显示所有资源限制,`ulimit -u`则用于查看或修改用户可创建的最大线程数。调整后,需要重启系统使新设置生效。 4. **注意性能优化**:线程数量并非越多越好...

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

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

    jvm虚拟机参数调优,tomcat调优

    线程池配置包括最大线程数、最小线程数、线程空闲时间等,可以通过`-XX:ParallelGCThreads`来设定并行GC的线程数。合理设置可以避免线程过多或过少导致的资源浪费和响应延迟。 类加载机制的优化主要涉及类加载器的...

    JVM内存空间分配笔记

    - 如果线程请求的栈深度大于虚拟机所允许的最大深度,则抛出 `StackOverflowError`;如果虚拟机栈容量可以动态扩展,当扩展时无法申请到足够的内存会抛出 `OutOfMemoryError`。 #### 四、本地方法栈 本地方法栈与...

    JVM 完整深入解析.pdf

    堆是JVM中最大的一块内存区域,主要用于存放对象实例。几乎所有通过new关键字创建的对象实例和数组都会被分配在堆上。堆是线程共享的,是垃圾收集器(GC)回收的主要区域。 ### Java内存模型(JMM) #### 共享内存...

    jvm的基础知识总结

    JVM的基础知识涵盖了其内存模型、垃圾回收机制、线程模型等多个方面,下面将详细总结这些基础知识。 ### JVM内存模型 JVM内存模型主要可以分为线程共享区域和线程私有区域。 **线程共享区域** 1. 堆(Heap):...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    2. **-Xmx**:设定JVM最大堆内存大小,不应超过物理内存的限制,以防内存溢出。 3. **-Xmn**:设置年轻代内存大小,通常不需要手动设置,JVM会根据实际情况自动调整。 4. **-Xss**:设定每个线程的栈大小,对于...

Global site tag (gtag.js) - Google Analytics