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)。
相关推荐
这大大减轻了程序员的负担,减少了因手动管理内存而引发的错误。然而,尽管ARC自动化了很多工作,但理解它的工作原理仍然是必要的,因为有些特殊情况(如循环引用)仍需要手动处理。 在OC中,循环引用是一种常见的...
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...
- GC(垃圾回收机制)是一种自动管理内存的技术,它负责自动释放不再使用的对象所占用的内存空间。在 .Net 平台上,GC 的存在极大地简化了程序员的工作,避免了手动释放内存导致的内存泄漏等问题。通过定期检查托管...
foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下: foreach (type identifier in expression) statement 若要循环访问集合,集合必须满足特定的...
很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. ...
提到压缩软件,我们可能会想到众多知名的如WinRAR、7-Zip等,但本文我们将聚焦于一个曾经颇受欢迎的开源压缩软件——CoolRAR。尽管目前它似乎已经不再开源,但其源代码仍然为我们提供了一个了解压缩技术的独特视角。...
- **Error** 通常表示系统级错误或程序无法处理的严重问题,如内存耗尽、线程死锁等。这些错误通常是致命的,程序很难从这些错误中恢复。因此,程序员通常不需要编写代码来捕获和处理这些错误。 - **Exception** ...
简单地说,Java具有如下特点:简单的、面向对象、平台无关、多线程、分布式、安全、 晑性能、可靠的、解释型、自动垃圾回收等特点。 这里只解释一下平台无关和分布式,其余的在后面会逐步接触到 3:平台无关 所谓平台...
在Windows操作系统中,我们通常会想到一个名为"任务管理器"的实用程序,但在这里,我们将讨论的是使用C#编程语言开发的任务管理器应用程序。C#是一种面向对象的、类型安全的编程语言,广泛应用于构建Windows桌面应用...
\两年前,当我们准备在Linux系统下开发GUI应用软件时,首先想到的就是选择一个GUI应用框架来简化开发。在三大GUI框架GTK+、Qt和wxWidgets 之间,我们选择了Qt 4工具包。作为重量级桌面系统KDE多年的坚实基础,Qt应该...
在Windows操作系统中,我们通常会想到一个图形界面的工具,但在此场景中,"TaskManager"似乎指的是一个Java应用程序。这个应用可能是为了教学或实践目的而创建的,特别是在描述中提到的"练习2",暗示着这是一个学习...