线程堆栈!

转载 2012年03月30日 15:55:12

一个线程的开销包括:
      内核模式下的开销(内核堆栈,对象管理所需内存)
      用户模式下的开销(线程局部存储、线程环境块、堆栈、CRT、MFC、COM等等等等)

      通常,线程数目的瓶颈在于线程自己的堆栈。Visual C++编译器默认设置是每个线程的堆栈
大小是1MB。当然,如果你在创建线程时指定较小的堆栈大小,你应该可以创建较多的线程。

      但是创建大量线程不是一个好的设计。每个线程创建和销毁的时候,Windows会调用已经加载的动态链接库的DLLMain,传递DLL_THREAD_ATTACH和DLL_THREAD_DETACH作为参数,除非动态库使用DisableThreadLibraryCalls禁用了这个通知。在创建大量线程的时候,这个开销是很大的。对于你这样的用后即弃的线程,你应该使用线程池。一个线程池示例可以在微软知识库找到。

     参数和局部变量的函数都存储在线程的堆栈。 如果声明局部变量具有大型值, 堆栈快速耗尽。 例如, 在以下代码示例函数要求堆栈来存储数组 1,200,000 个字节。

void func(void)
   {
     int i[300000];
     // Use 300,000 integers multiplied by 4 bytes per integer to store the array.
     return;
   }

要避免使用堆栈, 使用动态分配内存。 例如, 在以下代码示例函数动态分配内存。
void func(void)
   {
     int *i

     i = new int[400000];
     // More code goes here.
     return;
   }
   在此代码示例, 内存存储在堆栈代替。 因此, 函数不需要堆栈来存储数组 1,200,000 个字节。
由此也解开了为什么我在一个进程中创建大于2000个线程时导致程序异常退出,因为每个线程的默认堆
栈是1MB,2000*1MB = 2GB,my God!
可以在创建线程时指定线程堆栈大小,这样就能创建更多的线程了!但是前面提到,大量的创建线程并销
毁,会带来大量的系统开销,所以尽量避免创建大量线程,推荐使用线程池

 

线程堆栈(Thread Stack)和托管堆(Managed Heap)

内存格局通常分为四个区 全局数据区:存放全局变量,静态数据,常量 代码区:存放所有的程序代码 栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等, 堆区:即自由存储区       ...
  • xxdddail
  • xxdddail
  • 2014年07月04日 17:23
  • 2042

在多线程中体会堆和栈的区别

在多线程中体会堆和栈的区别  (2010-01-06 08:50:38) 转载▼ 标签:  c   多线程   内存管理   堆栈分配区别 ...
  • boshuzhang
  • boshuzhang
  • 2016年04月05日 11:57
  • 1765

进程和线程,堆和栈(整理)

进程和线程,堆和栈(整理)   2010-01-30 17:47:28|  分类: 进程线程栈堆|举报|字号 订阅      ...
  • boshuzhang
  • boshuzhang
  • 2016年04月05日 12:15
  • 1498

线程堆栈大小的使用介绍示例代码

  • 2015年09月27日 17:39
  • 1KB
  • 下载

pthread之线程堆栈分配 日志.doc

  • 2013年02月19日 10:03
  • 38KB
  • 下载

jstack 命令查看JAVA线程堆栈

JAVA堆栈信息实际生产中,可能由于开发以及测试未能全面覆盖的代码质量、性能问题,而引致线程挂起甚至崩溃。可能就需要查看堆栈信息来排查问题了。jps -lvmjps -lvm 用于查看当前机器上运行的...
  • zixiao217
  • zixiao217
  • 2017年08月06日 14:12
  • 1171

【Linux系统编程】线程堆栈大小的使用介绍

先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间。任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。一个线程真正拥有的唯一私有...
  • dengjin20104042056
  • dengjin20104042056
  • 2016年08月08日 22:43
  • 2228

查看Linux进程CPU过高具体的线程堆栈(不中断程序)

1、TOP命令,找到占用CPU最高的进程 [plain] view plain copy $ top      top - 20:11:45 u...
  • swartz_lubel
  • swartz_lubel
  • 2017年06月22日 16:27
  • 228

JAVA线程堆栈问题定位第一讲

一、如何制作线程堆栈 a.本地线程与java线程对应 本地线程: 是指java线程对应的虚拟机中的本地线程,java语言中的线程是依附于JVM虚拟机中的本地线程来运行,实际是...
  • he_jian1
  • he_jian1
  • 2015年06月28日 15:25
  • 699

轻巧的线程堆栈查看工具Hot Threads

定位性能问题,尤其是cpu使用率过高时,经常需要查找cpu消耗较高的线程,然后查看其堆栈,从而进入代码定位问题。 该场景下, jstack+top是一种非常经典的方式。 jstack+...
  • wang_quan_li
  • wang_quan_li
  • 2016年04月13日 11:51
  • 350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程堆栈!
举报原因:
原因补充:

(最多只允许输入30个字)