内存溢出,无法创建新的本地线程的原因和解决方案,java.lang.OutOfMemoryError: unable to create new native thread
I recently came across this exception on a couple of java systems that
use many threads java.lang.OutOfMemoryError: unable to create new
native thread. The strange thing was that the JVM had been assigned a
lot of memory (1.5GB) and that it had at least half the memory
available. Michele found this article that points out that the more
memory you give to the JVM the more likely you are to get
java.lang.OutOfMemoryError: unable to create new native thread
exceptions when you have many threads.
JVM已经分配了足够多的内存了(1.5GB),而且至少有一半的可用内存。但是当你有很多的线程在运行时,你给JVM的内存越多,你越容易出现无法创建本地线程的内存溢出。
Which makes perfect sense when you think about it. Each 32 bit
process on Windows has 2GB "available" memory as 2GB is reserved to
Windows. In my case the JVM grabbed 1.5 GB leaving 500MB. Part of the
500MB was used to map system dlls etc in memory so less than 400 MB was
left. Now to the crucial point: When you create a thread in java it
creates a Thread object in the JVM memory but it also creates a
operating system thread. The operating system creates the thread with a
thread stack in the 400MB that is left, not in the 1.5 GB allocated in
the JVM. Java 1.4 uses a default stack size of 256kb but Java 1.5 uses
a 1MB stack per thread. So, in the 400MB left to process I could only
generate ~400 threads. Absurd but true: to create more threads you have
to reduce the memory allocated to the JVM. Another option is to host
the JVM in your own process using JNI.
在32位的Windows机器上,最大有2G的内存,所以JVM一般使用1.5G留下500M。其中的一部分用来映射系统的dll到内存里面,所以只剩下了400M.此时,我们创建了一个java线程,它不仅在JVM的内存创建了线程对象,同时创建了操作系统的线程。
操作系统创建线程,使用了400M里的线程堆栈而不是JVM里面1.5GB的。 每个线程,Java 1.4默认使用 256k, 1.5默认使用 1M的堆栈。那么 400MB的内存,最多可以创建400个线程。为了创建更多的线程,你必须减少你的JVM分配的内存数。
This formula gives a decent estimate for the number of threads you can create:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
For Java 1.5 I get the following results assuming that the OS reserves about 120MB:
1.5GB allocated to JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
1.0GB allocated to JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
Java 1.4 uses 256kb for the thread stack which lets you create a lot more threads:
1.5GB allocated to JVM: ~1520 threads
1.0GB allocated to JVM: ~3520 threads
I have not tried the 3GB switch but it should in theory let you create more threads.
分享到:
相关推荐
scratch少儿编程逻辑思维游戏源码-拽猫跳跃.zip
scratch少儿编程逻辑思维游戏源码-足球冠军.zip
机器人开发教程&案例&相关项目资源,奖励仅
实训商业源码-【原创】Scode源码站原创个人单页-毕业设计.zip
实训商业源码-【超人】商家联盟V3.3.0原版免授权-毕业设计.zip
内容概要:本文详细介绍了基于STM32的步进电机S型曲线和SpTA加减速控制算法。S型曲线算法通过设定启动频率、加速时间、最高速度和加加速频率等参数,实现平滑的加减速控制,适用于高精度控制场合。SpTA算法则以其良好的自适应性和多路电机控制能力著称,尤其适合CPLD/FPGA环境。文中提供了详细的伪代码和实际代码示例,展示了两种算法的具体实现方法和技术细节。此外,文章还讨论了两种算法的实际测试效果和优化技巧,如利用定时器和DMA提高性能,确保电机运行更加稳定和平滑。 适合人群:从事嵌入式系统开发、步进电机控制及相关领域的工程师和技术爱好者。 使用场景及目标:①需要对步进电机进行高效、稳定的加减速控制;②希望深入了解S型曲线和SpTA算法的工作原理及其实现方法;③寻求优化现有控制系统性能的技术方案。 其他说明:文章不仅提供了理论解释,还包括了大量的代码片段和实际测试数据,帮助读者更好地理解和应用这些算法。
计算机二级考试试题&参考资料&心得攻略等资源,
scratch少儿编程逻辑思维游戏源码-钟声.zip
scratch少儿编程逻辑思维游戏源码-宇宙混沌.zip
内容概要:本文详细介绍了宽带消色差超构透镜的设计与仿真实现,重点探讨了几何相位和补偿相位的协同作用。通过硅纳米柱结构参数的优化,实现了3.7-4.5μm中红外波段的高效聚焦。文中提供了详细的FDTD建模、Matlab相位计算以及Python优化算法的代码片段,展示了如何通过相位叠加模型解决色散问题。实验结果显示,相比单一几何相位设计,色散补偿效果提升了近3倍,聚焦效率达到了68%。 适合人群:从事光学设计、超构材料研究、电磁仿真领域的科研人员和技术开发者。 使用场景及目标:适用于希望深入了解超构透镜设计原理的研究人员,特别是那些关注宽带消色差性能提升的人群。目标是掌握几何相位与补偿相位的联合应用,提高超构透镜在特定波段的聚焦效率。 其他说明:文章不仅提供了理论推导和公式解释,还分享了许多实际操作中的经验和技巧,如参数扫描、优化算法选择、仿真工具配置等。此外,还讨论了波长泛化能力和常见问题的解决方案。
【vue】Vue3+TS+Vite+pinia+elementPlus电商项目实战.zip
scratch少儿编程逻辑思维游戏源码-下落忍者.zip
内容概要:本文详细介绍了基于西门子1200 PLC的轴运动控制在海康威视路由器壳子装配机项目中的应用。主要内容涵盖硬件配置、轴控制程序、气缸报警块、PUT/GET块通讯等多个方面。硬件上,使用西门子1200 PLC为核心控制器,控制3个伺服和1个电缸,并与其他PLC通信。软件层面,通过编写轴控制块、气缸报警块和通讯程序实现了对设备的精确控制。文章不仅展示了具体的代码示例,还分享了许多实战经验和优化技巧,如参数动态加载、通讯超时保护、状态机模式报警处理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对西门子1200 PLC轴运动控制感兴趣的读者。 使用场景及目标:①学习如何使用西门子1200 PLC进行轴运动控制;②掌握轴控制块、气缸报警块和通讯程序的具体实现;③了解工业自动化项目中的常见问题及其解决方案。 其他说明:文章提供了丰富的实战经验和优化技巧,有助于提高读者在实际项目中的开发效率和解决问题的能力。此外,附带的代码示例和详细的注释使得学习更加直观和易懂。
scratch少儿编程逻辑思维游戏源码-纸片马里奥 激流勇进.zip
XK7130数控铣床工作台及床身设计.rar
内容概要:本文详细探讨了基于最优线性二次型(LQR)理论的多智能体系统最优控制问题,特别是针对存在外部干扰的情况。文章首先介绍了在无外部干扰条件下,通过性能指标函数优化获得最优分布式控制协议,并展示了具体的Python代码实现。接着,为了应对外部干扰,引入了DOBC(基于干扰观测器的控制)方法,通过估计并补偿干扰,确保系统的稳定性。此外,还提出了带有最小采样粒度的事件触发机制,进一步提高了控制效率,减少了计算资源的消耗。最终,通过仿真验证了所提出方法的有效性和优越性。 适合人群:对多智能体系统、最优控制理论以及相关应用感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要处理复杂环境下多智能体协作任务的研究项目,如机器人集群控制、自动化系统管理等。主要目标是在存在外部干扰的情况下,实现高效稳定的多智能体系统控制。 其他说明:文中提供了详细的代码示例,帮助读者更好地理解和实现所讨论的技术细节。同时,强调了在实际应用中需要注意的问题,如干扰估计的收敛速度、事件触发条件的设计等。
内容概要:本文详细介绍了利用MATLAB及其工具箱YALMIP和求解器CPLEX/Gurobi构建电-气-热综合能源系统的耦合优化调度模型。该模型采用39节点电力系统、比利时20节点天然气系统以及热网系统进行建模,通过直流潮流、线性化处理等手段将复杂的非线性问题转化为线性规划问题,从而提高求解效率。文中展示了具体的数学公式、代码片段及求解策略,如目标函数的设计、气网平衡方程的处理、热电联产(CHP)和电转气(P2G)设备的约束条件等。此外,还讨论了求解器的选择与性能比较,以及模块化的代码设计思想。 适合人群:从事能源系统优化研究的专业人士,尤其是对电力系统、天然气系统和热网系统有深入了解的研究人员和技术人员。 使用场景及目标:适用于希望深入理解电-气-热综合能源系统耦合机制的研究者和技术开发者。主要目标是掌握如何通过MATLAB实现高效的多能耦合优化调度,探索不同能源系统之间的相互作用及其对整体系统性能的影响。 其他说明:文章不仅提供了详细的理论推导和代码实现,还分享了许多实践经验,如参数调优、线性化处理技巧等。这对于实际工程项目中的应用具有重要的指导意义。
scratch少儿编程逻辑思维游戏源码-月影——城市素材.zip
实训商业源码- CCIA投票小程序V1.1.9开源版 前端+后端-毕业设计.zip
实训商业源码- 活动报名V4.4.9+年卡插件V1.1.8+分销海报V1.1.2-毕业设计.zip