`

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创建更多的线程。
分享到:
评论

相关推荐

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

    主要介绍了jvm支持最大线程数简单测试,具有一定参考价值,需要的朋友可以了解下。

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

    Weblogic提高并发处理性能的设置 对于1. 设置Weblogic线程数 2. 设置Weblogic JDBC 缓冲池 4. 修改 startWeblogic.cmd 文件

    JVM内存优化、垃圾回收、内存分析知识

    认识JVM内存优化, 避免最大的误区:认为JVM内存越大越好。看到一个线程 blocked就认为阻塞了。

    resin-jvm 调优

    引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。 1.2.对象引用遍历 早期的jvm使用引用计数,现在...

    浅谈IBM AIX环境下的Java性能调优

    本文介绍了什么是Java,AIX下的Java版本,Java的性能准则,AIX提供的监视Java的工具,以及如何在AIX用户环境下进行Java应用程序性能调优。

    JAVA 堆栈内存分析

    但是操作系统对一个进程内的线程数还是有限制的,不能无限生成, 经验值在3000~5000 左右。 -Xmn2g :设置堆内存年轻代大小为2G。整个堆内存大小= 年轻代大小+ 年老代大小+ 持久代大小。持久代一般固定大小为64m,...

    jmilktea#jmilktea#jvm常用参数1

    参数 | 解释内存类|-Xss: | 指定线程栈大小,默认是1M-Xms: | 指定jvm初始堆大小-Xmx: | 指定jvm最大可用内存-Xmn:| 设置新生

    JVM参数设置详细说明

    指定jvm的最大heap大小,如:-Xmx=2g b: -Xms 指定jvm的最小heap大小,如:-Xms=2g,高并发应用,建议和-Xmx一样,防止因为内存收缩/突然增大带来的性能影响。 c: -Xmn 指定jvm中New Generation的大小,如:-Xmn256m...

    JVM调优相关内容教程吐血整理干货.md

    调整线程栈大小。 -Xms 设置堆内存初始化大小。 -Xmx / -XX:MaxHeapSize=? 设置堆内存最大值。 -Xmn / -XX:NewSize=? 设置新生代大小。 -XX:NewRatio=? 设置老年代与新生代的空间占比。 如: -XX:NewRatio=2,那么...

    java是去蜗牛还是源码时代-JVM-:JVM-

    java是去蜗牛还是源码时代 JVM-JVM调优总结 -Xms -Xmx -Xmn -Xss(转) 田间的蜗牛chris ...为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存 -Xss 为jvm启动的每个线程分配的内

    jvm相关1

    jvm内存逻辑模型栈、堆、方法区、程序计数器、本地方法区堆(heap):是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区

    JVM原理与调优实战下载即用

    当然,服务器一定要是多线程的 设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3。 默认的就是1:2 减少GC对老年代的回收。设置生代带垃圾对象最大年龄,进量不要有大量连续内存空间的java对象,因为会直接到老...

    Tomcat内存溢出的三种情况及解决办法分析

    给出一个有关能够创建线程的最大个数的估算公式: (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 对于jdk1.5而言,假设操作系统保留120M内存: 1.5GB JVM: ...

    Java并发编程(学习笔记).xmind

    最大线程数,当线程数 >= corePoolSize的时候,会把runnable放入workQueue中 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了”...

    B站河北王校长-并发编程-深度核心面试知识汇总.pdf

    * 堆是一个进程中最大的一块内存,堆是被进程中的所有线程共享的,是进程创建时分配的,堆里面主要存放使用new操作创建的对象实例。 * 方法区则用来存放JVM加载的类、常量及静态变量等信息,也是线程共享的。 继承...

    【Java面试+Java学习指南】一部分大部分Java招聘所需要掌握的核心知识

    目录(善用Ctrl+F) 本人面试点合集 脑图在线编辑地址 ...最大公共子串 动态规划 大厂面试爱问的「调度算法」,20张图一举拿下 图解红黑树 面试必备 | 不可能的食品链表 红黑树【图解】 改进学习工具网站 必会框架

    java线程池概念.txt

    maximumPoolSize:线程池最大线程数,它表示在线程池中最多能创建多少个线程;这个参数是跟后面的阻塞队列联系紧密的;只有当阻塞队列满了,如果还有任务添加到线程池的话,会尝试new 一个Thread的进行救急处理,...

    Java新生代老年代的划分及回收算法

    Java堆(Java Heap)是JVM所管理的最大内存区域,也是所有线程共享的一块区域,在JVM启动时创建。 此内存区域存放的都是对象的实例和数组。JVM规范中说到:”所有的对象实例以及数组都要在堆上分配”。 Java堆是垃圾...

    Java学习指南,涵盖大部分Java程序员所需要掌握的核心知识

    最大公共子串 动态规划 大厂面试爱问的「调度算法」,20 张图一举拿下 图解红黑树 面试必备 | 不可不会的反转链表 红黑树【图解】 算法学习工具网站 必会框架 Spring全家桶以及源码分析 SpringCloud 分布式框架基石-...

Global site tag (gtag.js) - Google Analytics