`
flychao88
  • 浏览: 751870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由不断的创建线程产生的内存错误所想到的

 
阅读更多
public class MultiThreadOOM {
   public static class SleepThread implements Runnable
   public void run(){
          try {
             Thread.sleep(10000000);
          } catch (InterruptedException e) {
             e.printStackTrace();
          }
   } }
   public static void main(String args[]){
       for(int i=0;i<1500;i++){
          new Thread(new SleepThread(),"Thread"+i).start();
          System.out.println("Thread"+i+" created");
       }
} }

 

我们可以看到,运行结果如下:

Thread1125 created
Thread1126 created
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:693)
    at geym.zbase.ch7.oom.MultiThreadOOM.main(MultiThreadOOM.java:23)

 

分析问题:

这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下: 
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 
MaxProcessMemory:指的是一个进程的最大内存
JVMMemory             :  JVM内存
ReservedOsMemory:  保留的操作系统内存
ThreadStackSize      :  线程栈的大小

注:在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。 

分享到:
评论
2 楼 greemranqq 2015-12-08  
ivan19861025 写道
请问线程栈的大小怎么看?

XSS 可以设置,jinfo 好像可以看
1 楼 ivan19861025 2015-10-09  
请问线程栈的大小怎么看?

相关推荐

    OC中的内存管理

    这大大减轻了程序员的负担,减少了因手动管理内存而引发的错误。然而,尽管ARC自动化了很多工作,但理解它的工作原理仍然是必要的,因为有些特殊情况(如循环引用)仍需要手动处理。 在OC中,循环引用是一种常见的...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    Microsoft.Net常见问题集锦

    - GC(垃圾回收机制)是一种自动管理内存的技术,它负责自动释放不再使用的对象所占用的内存空间。在 .Net 平台上,GC 的存在极大地简化了程序员的工作,避免了手动释放内存导致的内存泄漏等问题。通过定期检查托管...

    c#学习笔记.txt

    foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下: foreach (type identifier in expression) statement 若要循环访问集合,集合必须满足特定的...

    二十三种设计模式【PDF版】

    很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. ...

    CoolRAR源码

    提到压缩软件,我们可能会想到众多知名的如WinRAR、7-Zip等,但本文我们将聚焦于一个曾经颇受欢迎的开源压缩软件——CoolRAR。尽管目前它似乎已经不再开源,但其源代码仍然为我们提供了一个了解压缩技术的独特视角。...

    银海软件java面试题

    - **Error** 通常表示系统级错误或程序无法处理的严重问题,如内存耗尽、线程死锁等。这些错误通常是致命的,程序很难从这些错误中恢复。因此,程序员通常不需要编写代码来捕获和处理这些错误。 - **Exception** ...

    Java经典入门教程pdf完整版

    简单地说,Java具有如下特点:简单的、面向对象、平台无关、多线程、分布式、安全、 晑性能、可靠的、解释型、自动垃圾回收等特点。 这里只解释一下平台无关和分布式,其余的在后面会逐步接触到 3:平台无关 所谓平台...

    C# 任务管理器

    在Windows操作系统中,我们通常会想到一个名为"任务管理器"的实用程序,但在这里,我们将讨论的是使用C#编程语言开发的任务管理器应用程序。C#是一种面向对象的、类型安全的编程语言,广泛应用于构建Windows桌面应用...

    精通qt4编程(源代码)

    \两年前,当我们准备在Linux系统下开发GUI应用软件时,首先想到的就是选择一个GUI应用框架来简化开发。在三大GUI框架GTK+、Qt和wxWidgets 之间,我们选择了Qt 4工具包。作为重量级桌面系统KDE多年的坚实基础,Qt应该...

    TaskManager:只是为了测试

    在Windows操作系统中,我们通常会想到一个图形界面的工具,但在此场景中,"TaskManager"似乎指的是一个Java应用程序。这个应用可能是为了教学或实践目的而创建的,特别是在描述中提到的"练习2",暗示着这是一个学习...

Global site tag (gtag.js) - Google Analytics