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创建更多的线程。
分享到:
相关推荐
合理设定最大线程数(-XX:MaxThreads)和最小线程数(-XX:InitialThreadCount),可以确保系统资源的高效利用。 2. **请求队列长度**:当线程池满时,新的请求会被放入队列等待。设置适当的队列长度可以防止拒绝服务。 ...
jvm支持最大线程数简单测试 jvm支持最大线程数简单测试是非常重要的知识点,下面将详细介绍该知识点。 1. JVM支持的最大线程数 jvm支持的最大线程数是受多种因素影响的,包括java堆内存大小、Thread的Stack内存...
在本文中,我们将讨论针对 WAS 6.1 的性能调优策略,涉及到线程数、JVM、日志和数据库连接等方面的优化。 一、线程数优化 在 WAS 6.1 中,线程数的设置对性能的影响非常大。我们可以通过设置 Web Container 的最大...
其中,maxThreads="600" 指定了最大线程数为 600,minSpareThreads="100" 指定了初始化时创建的线程数为 100,maxSpareThreads="500" 指定了一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程,...
理解核心线程数、最大线程数、线程存活时间等参数的意义。 8. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和 Phaser(阶段器)等,它们在多线程编程中提供了灵活...
`maxThreads`参数定义了服务器可以同时处理的最大线程数,即并发请求的最大数目。`acceptCount`参数则表示当达到`maxThreads`时,服务器还能接受并放入队列等待处理的连接数。适当调整这两个参数可以有效缓解服务器...
建议设置为最大线程数的70%-80%,即 `maxThreads * 0.7-0.8`。 - **`maxConnections`**:最大连接数。建议设置为CPU核心数乘以10再乘以200,即 `maxThreads * 200`。 - **`acceptCount`**:指定当所有可以使用的...
- **-Xmx712m**:设置JVM的最大堆内存大小为712MB。这是JVM运行过程中堆内存能够动态扩展的最大值。合理设置最大堆内存可以避免因内存不足而导致的OutOfMemoryError错误。 - **-XX:MaxPermSize=128m**:设置永久代...
本文将详细介绍通过调整Weblogic线程数、设置JDBC缓冲池以及修改`startWeblogic.cmd`文件来实现这一目标的方法。 #### 1. 设置Weblogic线程数 在Weblogic服务器中,线程数直接影响到服务器能够同时处理请求的能力...
此外,JVM的线程配置参数如“-Xss”设置每个线程的栈大小,对多线程应用的性能有直接影响。而“-XX:ParallelGCThreads”和“-XX:ConcGCThreads”分别控制并行和并发垃圾收集的线程数量,调整这两个参数可以优化垃圾...
- **`maxThreads`**:最大线程数,表示服务器可以同时处理的最大并发请求的数量。 - **`minSpareThreads`**:最小空闲线程数,即至少保持的未使用的线程数量。 - **`maxSpareThreads`**:最大空闲线程数,当活动线程...
- **ThreadPoolExecutor的定制**:可配置核心线程数、最大线程数、任务队列、拒绝策略等。 - **线程的中断与任务的取消**:线程中断标志的使用,以及Future的cancel方法来取消任务。 随着硬件的演进,开发者面临...
例如,核心线程数、最大线程数、工作队列的容量等参数的选择,会影响到应用的性能和资源利用率。 单例模式是一种常见的设计模式,它用于确保一个类只有一个实例,并提供一个全局访问点。单例的实现方法多种多样,如...
3. **使用`ulimit`命令查看和调整限制**:`ulimit -a`可以显示所有资源限制,`ulimit -u`则用于查看或修改用户可创建的最大线程数。调整后,需要重启系统使新设置生效。 4. **注意性能优化**:线程数量并非越多越好...
堆是 JVM 管理的最大一块内存区域,主要用于存储对象实例以及数组等数据类型。JVM 的堆空间可以根据实际需求动态调整大小,从而更好地适应程序运行时的变化情况。 为了提高内存分配效率,JVM 通常会采用一些优化...
线程池配置包括最大线程数、最小线程数、线程空闲时间等,可以通过`-XX:ParallelGCThreads`来设定并行GC的线程数。合理设置可以避免线程过多或过少导致的资源浪费和响应延迟。 类加载机制的优化主要涉及类加载器的...
- 如果线程请求的栈深度大于虚拟机所允许的最大深度,则抛出 `StackOverflowError`;如果虚拟机栈容量可以动态扩展,当扩展时无法申请到足够的内存会抛出 `OutOfMemoryError`。 #### 四、本地方法栈 本地方法栈与...
JVM的基础知识涵盖了其内存模型、垃圾回收机制、线程模型等多个方面,下面将详细总结这些基础知识。 ### JVM内存模型 JVM内存模型主要可以分为线程共享区域和线程私有区域。 **线程共享区域** 1. 堆(Heap):...
堆是JVM中最大的一块内存区域,主要用于存放对象实例。几乎所有通过new关键字创建的对象实例和数组都会被分配在堆上。堆是线程共享的,是垃圾收集器(GC)回收的主要区域。 ### Java内存模型(JMM) #### 共享内存...
2. **-Xmx**:设定JVM最大堆内存大小,不应超过物理内存的限制,以防内存溢出。 3. **-Xmn**:设置年轻代内存大小,通常不需要手动设置,JVM会根据实际情况自动调整。 4. **-Xss**:设定每个线程的栈大小,对于...