精华内容
下载资源
问答
  • windows 一个进程可以允许最大的线程数
    千次阅读
    2019-01-14 08:44:20

    默认情况下,一个线程的栈要预留1M的内存空间 
    而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 
    但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 
    你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 
    如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。 

    即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。 
    比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。


    如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。 

    如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。  

    在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?

    这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

    如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。

    更多相关内容
  • 修改Windows系统单进程使用内存上限,例:某程序调用内存WINDOWS系统上限为2G,为使该程序完全的使用4GB内存,可以通过文档中的方法修改
  • 首先讨论线程限制,因为每个活动进程至少有一个线程(终止的进程,但是由另一个进程拥有的句柄保持引用),所以进程的限制直接受到...例如,进程和线程需要物理内存,虚拟内存,内存池。所以可以创建的进程或线程的数量,...

           首先讨论线程限制,因为每个活动进程至少有一个线程(终止的进程,但是由另一个进程拥有的句柄保持引用),所以进程的限制直接受到限制线程的上限的影响。

            与一些UNIX变体不同,Windows中的大多数资源没有编译到操作系统中的固定上限,而是根据我已经介绍过的基本操作系统资源来推测它们的临界值。例如,进程和线程需要物理内存,虚拟内存,内存池。所以可以创建的进程或线程的数量,由这些资源中最先无法满足的那个限制。

       进程和线程

           Windows进程本质上是可执行镜像文件的【执行容器】。它由内核进程对象表示,Windows使用进程对象及其关联的数据结构来存储和跟踪有关映像执行的信息。例如,一个进程有一个虚拟地址空间,该空间保存进程的私有和共享数据,并将可执行镜像及其关联的dll映射到其中。Windows通过诊断工具记录进程对会计和查询资源的使用情况,并在进程的句柄表中注册进程对操作系统对象的引用。流程使用安全上下文(称为令牌)进行操作,令牌标识分配给流程的用户帐户、帐户组和特权。

            最后,一个进程包含一个或多个线程,这些线程实际执行进程中的代码(从实现角度,进程执行,真正执行的是线程),并且用内核线程对象表示。除了默认的初始线程(主线程)外,应用程序还会创建其他线程。例如:具有用户界面的进程通常创建工作者线程,以便主线程能够及时响应用户操作;希望利用多个处理器实现可伸缩性的应用程序。多线程能够使应用程序:发挥多核CPU的优势或在一个线程挂起时,仍然能够执行其他线程。

           线程的边界

            除了线程的基本信息(CPU寄存器状态,调度优先级,和资源使用统计信息)外,进程还会分配给线程地址空间给线程,称为堆栈。线程可以使用用来:储执函数参数,保持局部变量、函数返回地址等。这样,系统的虚拟内存就不会被不必要地浪费,只初始分配或提交了堆栈的一部分,其余部分则被保留。由于堆栈在内存中向下增长,系统将保护页面放置在堆栈内存之外,当访问该部分时,将触发额外内存的自动提交(称为堆栈扩展)。这张图显示了堆栈的提交区域是如何向下增长的,以及当堆栈扩展时保护页面是如何移动的,以32位地址空间为例(不是按比例绘制的):

    可执行映像的PE结构体保存线程堆栈保留大小和初始地址空间大小。链接器默认为预留1MB和一个内存页(4K),但是开发人员可以通过在链接程序时更改PE值或在调用CreateThread时更改单个线程的PE值来修改这些参数。您可以使用Visual Studio附带的Dumpbin之类的工具来查看可执行文件的设置。下面是带有/headers选项的Dumpbin输出,用于新Visual Studio项目生成的可执行文件:

    转换为十六进制,你可以看到堆栈预留的大小是1MB和初始的4 k。使用Sysinternals VMMap工具Attach这个过程并查看它的地址空间中,你可以清楚地看到一个线程栈的初始也,和一个保护页。和其余的保留堆栈内存:

    因为每个线程都会占用进程的地址空间的一部分,所以进程可以创建的线程数量有一个基本限制,地址的地址空间大小除以线程堆栈大小决定的。

    32位进程的最大线程数目

    即使线程没有代码段或数据段,并且整个地址空间都做为栈空间。一个32位进程使用默认的2GB地址空间最多可以创建2,048个线程。下面是运行在32位窗口上的Testlimit工具的输出,其中-t开关(创建线程):

           同样,由于代码和初始堆已经使用了部分地址空间,所以并不是所有的2GB都可以用于线程堆栈,因此所创建的总线程数不能完全达到2048的理论限制。

          在连接时,使用了大地址空间选项连接Testlimit程序。这意味着如果它提供超过2 gb的地址空间(例如在32位系统上启动/ 3 gb / USERVA ini选项或其等价的BCD选项)。32位进程在64位Windows上运行时,会有4GB的地址空间,所以32位Testlimit在64位Windows上运行时可以创建多少线程?根据我们到目前为止所讨论的内容,答案应该是4096 (4GB除以1MB),但是这个数字实际上要小得多。下面是运行在64位Windows XP上的32位Testlimit:

           差异的原因:当你在64位Windows上运行32位的应用程序,它实际上是一个64位进程——代表32位64位代码执行线程,因此有一个64位的线程堆栈和一个32位的线程堆栈区域留给每个线程。64位堆栈有256K的内存(xp及以前的系统,64位线程的初始堆栈是1MB)。因为每个32位线程都是以64位模式开始其生命周期的,并且在启动时使用的堆栈空间超过了一个页面,所以您通常会看到使用了至少16KB的64位堆栈。下面是一个32位线程的64位和32位堆栈的例子(标记为“Wow64”的是32位堆栈):

    32位Testlimit能够在64位Windows上创建3204个线程,这正是您所期望的,因为每个线程都使用1MB+256K的地址空间(同样,除了Vista之前版本的第一个线程使用1MB+1MB)。但是,当我在64位Windows 7上运行32位Testlimit时,得到了不同的结果:

          Windows XP结果和Windows 7结果之间的差异是由于Windows Vista中引入的地址空间布局的随机性,即地址空间负载随机化(ASLR),这导致了一些碎片。DLL加载、线程堆栈和堆位置的随机化,有助于防止恶意代码注入。从VMMap输出中可以看到,仍然有357MB的地址空间可用,但是最大的空闲块大小只有128K,这比32位堆栈所需的1MB要小:

           正如我所提到的,开发人员可以覆盖缺省堆栈储备。这样做的一个原因是,当线程的堆栈使用量始终显著小于默认的1MB时,可以避免浪费地址空间。Testlimit将其PE映像中的默认堆栈保留设置为64K,当您将-n开关和-t开关包括进来时,Testlimit将创建具有64K堆栈的线程。这是一个32位Windows XP系统的输出,内存为256MB(我在一个小系统上做了这个实验,以突出这个特殊的限制):

           注意不同的错误,这意味着这里的问题不是地址空间。事实上,64K堆栈应该允许大约32,000个线程(2GB/64K = 32,768)。这里的极限是多少?看看可能的候选人,包括commit和pool,不要给出任何线索,因为他们都低于自己的极限:

    它只是查看内核调试器中的额外内存信息,显示示了正在被命中的阈值,即已耗尽的驻留可用内存:

         常驻可用内存是可以分配给必须保存在RAM中数据或代码。例如,未分页池和未分页驱动程序会对其进行计数,为设备I/O操作锁定在RAM中的内存也是如此。每个线程都有一个用户模式堆栈,这是我一直在讨论的,但是它们也有一个内核模式堆栈,当它们在内核模式下运行时使用,例如在执行系统调用时。当一个线程处于活动状态时,它的内核堆栈被锁定在内存中,以便线程可以在内核中执行不能分页错误的代码。

    一个基本的内核堆栈在32位Windows上是12K,在64位Windows上是24K。14,225个线程需要170MB常驻可访问内存。这与Testlimit不运行时系统空闲内存的确切数量相对应:

    一旦达到驻留可用内存限制,许多基本操作就会开始失败。例如,当我双击桌面的Internet Explorer快捷方式时,出现了以下错误:

    正如预期的,当运行在64位Windows和256MB内存上时,Testlimit只能创建6600个线程——大约是它在32位Windows和256MB内存上创建的线程的一半——然后耗尽驻留的可用内存:

    我前面说“基本”内核堆栈的原因是,执行图形或窗口函数的线程在执行第一个调用时得到一个“大”堆栈,该调用在32位Windows上为20K,在64位Windows上为48K。Testlimit的线程不调用任何这样的api,所以它们有基本的内核堆栈。

    64位线程的限制

    与32位线程一样,64位线程也为堆栈保留了1MB的默认值,但是64位进程拥有更大的用户模式地址空间(8TB),所以在创建大量线程时,地址空间应该不是问题。不过,驻留可用内存显然仍然是一个潜在的限制器。64位版本的Testlimit (Testlimit64.exe)能够在256MB的64位Windows XP系统上创建大约6,600个线程,而不需要-n开关,这与32位版本创建的线程数相同,因为它也达到了驻留的可用内存限制。但是,在一个有2GB RAM的系统上,Testlimit64只能创建55,000个线程,远远低于它应该能够创建的线程数,如果常驻可用内存是限制器(2GB/24K = 89,000):

    在本例中,正是初始线程堆栈提交导致系统耗尽虚拟内存和“分页文件太小”错误。一旦提交级别达到RAM的大小,创建线程的速度就会减慢,因为系统开始抖动,将之前创建的线程堆分页出来,为新线程堆腾出空间,并且必须扩展分页文件。当指定-n开关时,结果是相同的,因为线程具有相同的初始堆栈。

    进程限制

    Windows支持的进程数量显然必须小于线程数量,因为每个进程都有一个线程,而进程本身会导致额外的资源使用。运行在2GB 64位Windows XP系统上的32位Testlimit创建了大约8400个进程:

    查看内核调试器显示,它达到了驻留的可用内存限制:

    如果一个进程相对于驻留可用内存的惟一成本是内核模式线程堆栈,那么Testlimit将能够在2GB系统上创建超过8400个线程。当Testlimit不运行时,系统上驻留的可用内存为1.9GB:

    将使用的驻留内存Testlimit的数量(1.9GB)除以它创建的进程的数量(8,400),每个进程产生230K的驻留内存。由于64位内核堆栈是24K,因此大约有206K没有计算在内。其余的消耗从何而来?创建进程时,Windows保留足够的物理内存来容纳进程的最小工作集大小。作为保证,无论如何,必须有足够的可用物理内存来容纳足够的数据来满足其最小工作集。默认的工作集大小是200 kb,事实很明显当你添加的最小工作集列process Explorer的显示:

    剩下的大约6K是为表示进程分配的额外非分页内存占用的驻留可用内存。32位Windows上的进程将使用更少的驻留内存,因为它的内核模式线程堆栈更小。

    与用户模式线程堆栈一样,进程可以使用SetProcessWorkingSetSize函数覆盖其默认工作集大小。Testlimit支持一个-n开关,当它与-p相结合时,会使主Testlimit进程的子进程将其工作集设置为尽可能小的值,即80K。因为子进程必须运行以收缩它们的工作集,Testlimit在不能创建更多进程之后休眠,然后再次尝试给它的子进程一个执行的机会。在一个内存为4GB的Windows 7系统上,使用-n开关执行的Testlimit达到了驻留可用内存以外的限制:系统提交限制:

    在这里你可以看到系统的内核调试器报告不仅承诺限制被命中,但这已经有成千上万的内存分配失败,虚拟和分页池的分配,耗尽的提交限制(系统提交限制实际上是打几次作为分页文件了,然后发展到提高限制):

    Testlimit运行之前的基线承诺约为1.5GB,因此线程消耗了约8GB的已提交内存。因此,每个进程大约消耗8GB/6,600,即1.2MB。内核调试器的!vm命令的输出,显示了每个活动进程分配的私有内存,确认了计算结果:

    前面描述的初始线程堆栈承诺影响很小,其余的影响来自进程地址空间数据结构、页表条目、句柄表、进程和线程对象以及进程初始化时创建的私有数据所需的内存。

    有多少线程和进程是足够的?
    “Windows支持多少线程?”以及“在Windows上可以同时运行多少个进程?”“视情况而定。除了线程指定堆栈大小和进程指定最小工作集的方式的细微差别之外,在任何特定系统上决定答案的两个主要因素还包括物理内存的数量和系统提交限制。在任何情况下,创建足够多的线程或进程以接近这些限制的应用程序都应该重新考虑它们的设计,因为几乎总是有其他方法可以用合理的数量来实现相同的目标。例如,一个可伸缩应用程序的总体目标是保持运行的线程数量等于cpu的个数(NUMA改变这种考虑每个节点cpu)和一个实现这一方法是切换使用同步I / O使用异步I / O和依赖于I / O完成端口来帮助匹配运行线程的数量的cpu数量。

    展开全文
  • 32位操作系统单进程最大使用4G内存 参考文献: 有此疑问的原因:在看jvm书籍时,碰到了介绍“直接内存”的内容,直接内存不是虚拟机运行时数据区的一部分,所以也就不是jvm名义上管理的部分,同时《java虚拟机规范》...

    32位操作系统单进程最大使用4G内存

    参考文献:

    有此疑问的原因:在看jvm书籍时,碰到了介绍“直接内存”的内容,直接内存不是虚拟机运行时数据区的一部分,所以也就不是jvm名义上管理的部分,同时《java虚拟机规范》也未对其定义,但是这块区域也会被经常使用。这块区域使用的是计算机本身的内存,那么就需要考虑在给jvm各个区域提供参数时各个值的大小了,比如32位操作系统中,单进程最大可用4G的内存,如果jvm中各个区域占用内存很接近4G的话,就可能导致直接内存这块产生OOM(直接内存区域也会有OOM产生,这里不说原因了)。

    解释之前先说几个定义:
    1.4G = 2^32B;
    2.1B = 8 bit;
    3.1KB = 1024B;
    4.1MB = 1024KB;
    5.1GB = 1024MB;
    6.1TB = 1024GB;
    7.32bit操作系统表示的是cpu单次可以处理的数据位数是32位,64位就是64位了。

    疑问点:为什么操作系统单进程会有最大内存使用范围呢(32位操作系统就是4G)?
    这就要说cpu的寻址能力了,32位的操作系统的cpu的寻址能力就是0到2^32-1,寻址能力为什么是这个数?这就与电路结构有关系了,是硬件的东西,32的操作系统的地址总线是32,便决定了寻址能力只能是 2的32次方,那么回到原来的问题,为什么寻址能力是0到2的32次方减1,32位系统的单进程最大可用内存就是4G了呢?因为cpu操作数据的来源都是内存,怎么操作这些数据呢就是通过寻址内存来操作的,既然最大只能寻址到2的32次方-1,自然其余部分就读取不到了,所以才会有32位操作系统单进程最大可用内存为4G的说法。

    展开全文
  • 程序可以使用一系列连续的虚拟地址来访问物理内存中不连续的大内存缓冲区。 程序可以使用一系列虚拟地址来访问大于可用物理内存内存缓冲区。 当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 ...
    1. 虚拟地址空间说明

    当处理器读取或写入内存位置时,它会使用虚拟地址。 在读取或写入操作过程中,处理器会将虚拟地址转换为物理地址。 通过虚拟地址访问内存有以下优势:

    程序可以使用一系列连续的虚拟地址来访问物理内存中不连续的大内存缓冲区。

    程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。 当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。 数据或代码页会根据需要在物理内存与磁盘之间移动。

    不同进程使用的虚拟地址彼此隔离。 一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。

    进程可用的虚拟地址范围称为该进程的“虚拟地址空间” 。 每个用户模式进程都有其各自的专用虚拟地址空间。 对于 32 位进程,虚拟地址空间通常为 2 GB,范围从 0x00000000 至 0x7FFFFFFF。 对于 64 位 Windows 上的 64 位进程,虚拟地址空间为 128 TB,范围从 0x000’00000000 至 0x7FFF’FFFFFFFF。 一系列虚拟地址有时称为一系列“虚拟内存” 。
    2. 内存使用限制说明
    在这里插入图片描述

    展开全文
  • 该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全有Windows后台管理,其实际结 果是32位处理器上的每个进程都可以使用4GB的内存------无论计算机上有多少硬盘空间(在64位处理器上这个数值会...
  • windows 32位系统中进程最大可用内存空间为3GB (转) http://msdn.microsoft.com/zh-cn/library/ms189334.aspx 进程地址空间 所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的...
  •  32位应用程序单个进程最大占用内存是4GB左右,这个问题是因为需要测试大数据里才能体现出来的问题,所以反反复复花了一周多的时间来搞定它,希望大家在对它有一个印象。64位的应用程序的时候就不会有这个限制。...
  • Windows 7/8各版本支持最大内存容量

    千次阅读 2015-06-18 17:16:47
    Windows 7 中的物理内存限制Windows 7有6个主要版本,分别是Windows 7 Starter(简易版),Windows 7 Home Basic(家庭普通版),Windows 7 Home Premium(家庭高级版),Windows 7 Professional(专业版),Windows...
  • 一个程序最多可以使用多少内存

    千次阅读 2020-05-20 13:16:19
    在虚拟地址模式下,一个程序可以使用的内存...在32位操作系统中,程序能使用最大内存是 4GB,也就是2的32次方。即使你的电脑安装的是16G的内存条也没用,剩下的12G只能空闲着。 让你买那么大的内存,浪费了吧! ...
  • 单个进程最大线程数

    千次阅读 2015-09-11 14:50:24
    windows 操作系统中允许的最大线程数。   =========================================================================== 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间
  • 某项目的应用服务器CPU和内存使用率的监控,通过zabbix系统监控记录应用服务器上进程的CPU和内存的使用情况,并以图表的形式实时展现,以便于我们分析服务器的性能瓶颈。 监控方式 利用zabbix监控系统的自动发现...
  • 监控Java应用程序Windows内存使用情况

    千次阅读 2019-01-20 17:08:42
    监控Java应用程序Windows内存使用情况
  • WINDOWS 单个程序配置内存上限命令。

    千次阅读 2013-02-03 15:16:34
    bcdedit /set IncreaseUserVa 4096
  • Nginx 单个进程允许的最大连接数

    万次阅读 2018-08-24 16:38:39
    (1) 控制 Nginx 单个进程允许的最大连接数的参数为 worker_connections ,这个参数要根据服务器性能和内存使用量来调整 (2) 进程最大连接数受 Linux 系统进程最大打开文件数限制,只有执行了 “ulimit -HSn ...
  • 虚拟内存以及进程的虚拟内存分布(第六章)

    千次阅读 多人点赞 2019-05-17 10:59:58
    在早期的计算机中,程序都是直接运行在物理内存上的,运行时访问的地址都是物理地址,而这要求程序使用内存空间不超过物理内存的大小。在现代计算机操作系统中,计算机同时运行多个程序,为了提高CPU的利用率和...
  • 页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一、基本概念1. 两个内存概念物理内存:人尽皆知,就是插在主板上的内存条。他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外...
  • Windows内存清理篇——小结

    千次阅读 2020-02-20 15:49:59
    Windows操作系统给人最大的烦恼就是内存清理,不知不觉C盘就满了,一直以来我都在和内存作着艰苦的斗争,最近再一次清理了一下,并决定将我的清理之路做一个小汇总,方便以后整理电脑的时候可以直接看看博客,不用...
  • linux进程中的内存分布

    千次阅读 多人点赞 2020-06-18 11:10:48
    进程空间分布概述 对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。 未初始化过的数据...
  •  在网上进行一波搜索之后才领悟到:虽然现在电脑是Win7 64位,但是VC++6.0是从Win32的平台移植到win7 64位上的,所以归根结底,依然VC++6.0编写出来的程序依然是Win32程序,Windows系统对于Win32程序的单进程可用...
  • sql server windows nt 64bit 内存占用过高

    千次阅读 2020-09-10 22:18:36
    配置一些sql server所占用的最大内存即可解决: https://blog.csdn.net/baidu_40216896/article/details/102815630 正文开始: 今天晚上7点,同时突然发来消息,某个项目的服务器内存暴了,图片如下: 看...
  • 进程内存分布

    千次阅读 2018-09-04 04:50:39
    一个进程内存主要分为五部分: text(文本/代码段),initialize data(数据段),uninitialized data(未初始化数据段),heap(堆),stack(栈), 如下图:   1.文本段也叫代码段,是对象文件或内...
  • Linux进程地址空间和进程内存分布

    万次阅读 多人点赞 2018-05-15 20:13:18
    原网址为:https://blog.csdn.net/yusiguyuan/article/details/45155035一 进程空间分布概述 对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。初始化过的...
  • windows内存结构概述

    千次阅读 2018-03-24 15:03:22
    13.1 Windows的虚拟地址空间安排 13.1.1虚拟地址空间的分区(即...进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Windows X64 64位 Windows IA-64 64位 Windows 空指针赋值区
  • 转自:https://blog.csdn.net/rebirthme/article/details/50402082想必在linux上写过程序的同学都有...通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表...
  • 不管是在 32 位 Windows 还是在 64 位 Windows,32 位应用程序都只能使用最大 2GB 的内存,这是我们司空见惯的一个设定。但其实 Windows 提供了一些方法让我们打破这样的设定,使程序使用大于 2GB 的内存。 为什么 ...
  • Android单个进程内存分配策略

    千次阅读 2012-03-10 16:26:47
    android不同设备单个进程可用内存是不一样的,可以查看/system/build.prop文件。 # This is a high density device with more memory,...上面heapsize参数表示单个进程可用的最大内存如果存在如下参数: dalvik.v
  • 该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全有Windows后台管理,其实际结果是32位处理器上的每个进程都可以使用4GB的内存------无论计算机上有多少硬盘空间(在64位处理器上这个数值会更...
  • 32位模式下C/C++程序可用最大内存

    千次阅读 2018-03-23 20:38:47
    AWE 可以将最大内存容量 64 GB 的一部分映射到用户地址空间来实现此功能。应用程序缓冲池和 AWE 映射内存之间的映射通过操作 Windows 虚拟内存表来完成。 为了支持 3 GB 的用户模式进程空间,必须将 /3gb 参数添加到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,425
精华内容 41,370
关键字:

windows单进程最大使用内存