在近日的测试中发现,无论resin.conf中配置的并发连接数多高,例如2048,resin实例能支持的并发活动线程数,或者说是活动连接数,最高只能去到500多。
linux下使用以下命令查看:ps -eLf |grep |wc -l
// default timeout
private long _timeout = 65000L;
private int _connectionMax = 512;//查找resin所有源码后,发现没有对这个值进行设置
private int _minSpareConnection = 16;
private int _keepaliveMax = -1;
private int _minSpareListen = 5;
private int _maxSpareListen = 10;
这个加大以后能到3000
<thread-pool>
<!-- Maximum number of threads. -->
<thread-max>20480</thread-max>
<!-- Minimum number of spare connection threads. -->
<spare-thread-min>10</spare-thread-min>
</thread-pool>
然后就会报这个错误
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:574)
at com.caucho.util.ThreadPool$ThreadLauncher.startConnection(ThreadPool.java:621)
at com.caucho.util.ThreadPool$ThreadLauncher.run(ThreadPool.java:660)
这个限制可以换64位系统解决:
这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小
在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。
结合上面例子我们来对公式说明一下:
MaxProcessMemory 在32位的 windows下是 2G
JVMMemory eclipse默认启动的程序内存是64M
ReservedOsMemory 一般是150M左右
ThreadStackSize 32位 JDK 1.5默认的stacksize 256K左右
公式如下:
(2*1024*1024-64*1024-150*1024)/256 = 7336
公式计算所得7336,和实践7117基本一致(有偏差是因为ReservedOsMemory不能很精确)
由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。
咦,有点背我们的常理,恩,让我们来验证一下,依旧使用上面的测试程序,加上下面的JVM参数,测试结果如下:
ThreadStackSize JVMMemory 能创建的线程数
默认的256K -Xms64m -Xmx64m i = 7117
默认的256K -Xms32m -Xmx32m i = 7244
-Xss128k -Xms64m -Xmx64m i = ?
完全和公式一致。
三、解决问题:
1, 如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的。
2, 如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
a, MaxProcessMemory 使用64位操作系统
b, JVMMemory 减少JVMMemory的分配
c, ThreadStackSize 减小单个线程的栈大小
分享到:
相关推荐
【JBOSSTomcat最大连接数配置和JVM内存配置】 在JBOSSTomcat服务器的性能优化中,最大连接数配置和JVM内存配置是两个至关重要的环节,它们直接影响到服务器的响应速度和稳定性,尤其对于处理大量并发请求的场景。 ...
1. **JVM配置**:优化JVM参数如堆大小、垃圾收集策略和并发设置以提高性能。 2. **线程池调整**:根据应用负载调整Jboss的工作线程池大小。 3. **缓存策略**:配置EJB和JPA缓存以提高数据访问速度。 4. **连接池**:...
3. 在JBoss配置文件中设置数据源和驱动。 4. 了解JNDI命名以便在应用程序中引用数据源。 这些步骤确保了JBoss 7能够成功连接到Oracle数据库,并进行数据操作。对于开发和运维人员来说,理解和掌握这些配置细节至关...
对于性能优化,可以通过调整连接池大小、超时设置等参数,以及使用最新的驱动版本来提升系统性能。 总之,在JBoss中连接Oracle数据库涉及下载JDBC驱动、配置数据源、调整连接池参数、测试连接以及考虑安全性与性能...
JBoss 服务器是一款...以上就是关于JBoss服务器配置的详细说明,包括设置JMX控制台的身份验证、启动和关闭服务器的步骤,以及如何更改数据库连接和端口设置。理解并掌握这些配置对于管理和维护JBoss服务器至关重要。
### JBoss安全性设置详解 #### 一、JMX控制台安全性配置 在部署与管理Java应用服务器时,确保系统的安全性是至关重要的一步。对于JBoss AS(Application Server),特别是其管理控制台——JMX Console的安全性配置...
java 服务器配置 tomcat、resin、jboss 借鉴 本文档旨在介绍 java 服务器配置 tomcat、resin、jboss 的详细步骤,涵盖了服务器软件的安装、配置、部署和大并发配置等方面的内容。 一、Resin 服务器配置 1. 安装和...
### JBoss服务设置开机自启(Linux) #### 知识点概述 在Linux环境中,确保JBoss服务能够随系统启动而自动启动对于提高系统的稳定性和可用性至关重要。本篇文章将详细介绍如何在CentOS 7环境下配置JBoss服务,使其...
通过调整连接池的最大活动连接数、最大空闲连接数等参数,可以使数据库访问更加高效。 #### 五、JBoss部署目录优化 合理的部署结构能够提高部署效率,减少启动时间。建议按照功能模块将应用程序划分到不同的子目录...
- **最小连接数**:合理设置最小连接数可以确保有足够的连接可用,同时避免过多闲置连接占用内存。 优化数据库连接池不仅可以提高数据库访问效率,还能显著降低内存消耗。 ##### 4. 系统线程池优化 在`.jboss\...
- `<max-pool-size>`:最大连接池大小,本例中设置为300。 - `<exception-sorter-class-name>`:异常排序器类名,这里使用`org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter`来处理Oracle相关的异常...
2. **环境变量设置**:设置两个环境变量,`CLASSPATH`和`JBOSS_HOME`,以确保JBoss能找到所需的库文件和启动配置。 3. **JDBC驱动的部署**:将MySQL的JDBC驱动复制到JBoss的`lib`目录,使得服务器在启动时能够加载...
在IT行业中,数据库连接配置是开发企业级应用时不可或缺的一部分,特别是对于像JBoss这样的Java应用服务器来说。本文将详细讲解如何配置JBoss 6与SQL Server 2000之间的连接。 首先,JBoss 6是一个开源的应用服务器...
### Linux下安装JBoss并设置自启动服务 在Linux环境下安装JBoss并配置其作为系统服务自启动是一项常见的任务,特别是在部署Java应用服务器时。本文将详细介绍如何在Linux环境中完成这些步骤,包括JDK的安装、环境...
Java服务器配置涉及三个主要的服务器软件:Tomcat、Resin和JBoss,它们都是用于运行Java应用程序的Web服务器和应用服务器。以下是对这三个服务器的详细配置步骤和关键知识点的总结。 1. **Resin** - **配置与部署*...
本篇文章将详细讲解JBoss的安装和部署过程,帮助你深入了解如何在本地环境中设置并运行JBoss应用服务器。 1. **系统要求**: 在开始安装前,确保你的操作系统满足JBoss的最低需求。通常,JBoss支持Windows、Linux...
在Eclipse中使用JBoss数据库连接池技术,主要是为了提高应用程序的性能和资源管理效率。数据库连接池技术允许应用程序重复使用已经建立的数据库连接,而不是每次需要时都创建新的连接,从而减少了数据库连接的创建和...