一、认识问题:

首先我们通过下面这个 测试程序 来认识这个问题:
运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,
测试程序:

Java代码  
  1. import java.util.concurrent.CountDownLatch;
  2. public class TestNativeOutOfMemoryError {
  3. public static void main(String[] args) {
  4. for (int i = 0;; i++) {
  5. System.out.println("i = " + i);
  6. new Thread(new HoldThread()).start();
  7. }
  8. }
  9. }
  10. class HoldThread extends Thread {
  11. CountDownLatch cdl = new CountDownLatch(1);
  12. public HoldThread() {
  13. this.setDaemon(true);
  14. }
  15. public void run() {
  16. try {
  17. cdl.await();
  18. } catch (InterruptedException e) {
  19. }
  20. }
  21. }

不指定任何JVM参数,eclipse中直接运行输出,看到了这位朋友了吧:
i = 5602
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:597)
    at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)

二、分析问题:

这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:
(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  一般是130M左右
ThreadStackSize 32位 JDK 1.6默认的stacksize 325K左右
公式如下:
(2*1024*1024-64*1024-130*1024)/325 = 5841
公式计算所得5841,和实践5602基本一致(有偏差是因为ReservedOsMemory不能很精确)

由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

最新文章

  1. 标准io与文件io
  2. PHP include语句和require语句
  3. shell下的作业管理[转]
  4. webstorm 10.0.4 注册码
  5. Codeforces Round #333 DIV2
  6. Spring SimpleJdbcTemplate batchUpdate() example
  7. jinfo用法
  8. JS对undefined,null,NaN判断
  9. FatMouse' Trade(hdoj1009)
  10. UINavigationItem不显示
  11. 解决error104 connection reset by peer;socket error问题
  12. return flase 作用
  13. KVM 时钟分析
  14. webpack分片chunk加载原理
  15. Python_day8
  16. Java 内存模型和硬件内存架构笔记
  17. mysql索引及优化
  18. MFC中卡拉OK字体的定时器实现,使用DC的DrawText函数实现
  19. LINK : fatal error LNK1123
  20. 20164321 王君陶 Exp1 PC平台逆向破解

热门文章

  1. 在ASP.Net Core下,Autofac实现自动注入
  2. JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)
  3. webpack代码分离 ensure 看了还不懂,你打我(转)
  4. 简化的CDN架构分析
  5. window下如何使用Git上传代码到github远程服务器上(转)
  6. Android View绘制和显示原理简介
  7. FusionCharts 3D环饼图
  8. 如何获取Linux-gate.so.1动态库
  9. 【html5】html学习笔记1
  10. javascript 正则表达式学习教程