XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog

 

 


 

在本机 IIS 进程中创建线程的默认最大堆栈大小为 256 KB

本文介绍了由本机应用程序 IIS Microsoft Internet Information Services (创建线程的默认最大) 大小。

原始产品版本:  Internet Information Services 8.0
原始 KB 编号:   932909

摘要

默认情况下,在 Windows Server 2008 之前,本机 IIS 进程创建的线程的最大堆栈大小为 256 KB。 例如,Inetinfo.exe、DLLHost.exe 或 W3wp.exe 在 IIS 5.0 或 IIS 6.0 中创建线程时,线程的最大堆栈大小默认为 256 KB。 还可以显式调用 CreateThread 函数以指定线程的堆栈大小。 在 Microsoft Windows 2000 中,如果Microsoft ASP.NET 工作进程 (ASPNet_wp.exe) 创建线程,则线程的最大堆栈大小为 1 MB。 在 Windows Server 2008 及更高版本中,在 32 位版本 IIS 上运行的线程的最大堆栈大小为 256 KB,在 x64 服务器上运行的线程的最大堆栈大小为 512 KB。

 备注

Internet Information Services是一个多线程 Web 应用程序平台,它允许在每个工作进程中运行的应用程序代码在必要时一次利用数百个或多个线程。 每个线程都受相同堆栈大小限制的限制,以便保持进程的虚拟内存使用量在可管理的限制内。

更多信息

线程的最大堆栈大小不是由进程内运行的单个 ISAPI、DLL 或 ASP 组件决定的。 线程的最大堆栈大小由进程的可执行文件配置。 如果你必须具有较大的堆栈大小,可以编程方式创建线程,然后设置适当的堆栈大小。 或者,如果线程耗尽了最大堆栈大小,则必须更改应用程序中的代码以正确使用堆栈。

函数的参数和局部变量存储在线程的堆栈中。 如果声明具有较大值的局部变量,堆栈将快速耗尽。 例如,以下代码示例中的 函数需要堆栈中 400,000 字节来存储数组。

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

 备注

不能在 IIS 4.0、IIS 5.0、IIS 5.1 或 IIS 6.0 中调用此函数。

若要避免使用堆栈,请动态分配内存。 例如,以下代码示例中的 函数动态分配内存。 

void func(void)
{
    int *i
    i = new int[100000];
    // More code goes here.
    return;
}

在此代码示例中,内存存储在堆栈而不是堆栈中。 因此,该函数不需要在堆栈中存储数组的 400,000 字节。

如果以递归方式调用函数,堆栈可能很快就会耗尽。 例如,如果满足以下条件,函数需要在堆栈中具有 400,000 个字节:

  • 该函数需要 40 个字节作为本地变量。
  • 函数以递归方式调用 10,000 次。

在通用网关接口 (CGI) 应用程序中,线程的最大堆栈大小不是 256 KB。 启动 CGI 应用程序时,将创建一个新进程,并且 CGI 可执行文件将配置堆栈大小。 还可以显式调用 CreateThread 函数以指定线程的堆栈大小。

有关详细信息,请参阅线程 堆栈大小


Thread(ThreadStart, Int32)

初始化 Thread 类的新实例,指定线程的最大堆栈大小。

public Thread (System.Threading.ThreadStart start, int maxStackSize);

参数

start
ThreadStart

表示开始执行此线程时要调用的方法的 ThreadStart 委托。

maxStackSize
Int32

线程要使用的最大堆栈大小(以字节为单位);如果为 0,则使用可执行文件的文件头中指定的默认最大堆栈大小。

重要事项:对于部分受信任的代码,如果 maxStackSize 大于默认堆栈大小,则会将其忽略。 不引发异常。

例外

start 为 null

maxStackSize 小于零。

注解

避免使用此构造函数重载。 构造函数重载使用的默认堆栈大小 Thread(ThreadStart) 是线程的建议堆栈大小。 如果线程存在内存问题,最可能的原因是编程错误,如无限递归。

 重要

从 .NET Framework 4 开始,仅完全受信任的代码可设置 maxStackSize 为大于默认堆栈大小 (1 mb) 的值。 如果为 maxStackSize 在部分信任环境下运行的代码指定了较大的值, maxStackSize 则将忽略,并使用默认的堆栈大小。 不引发异常。 任何信任级别的代码都可以设置 maxStackSize 为小于默认堆栈大小的值。

 备注

如果你正在开发将由部分信任的代码使用的完全受信任的库,并且你需要启动需要大型堆栈的线程,则必须在创建该线程之前断言完全信任,否则将使用默认堆栈大小。 除非你完全控制在线程上运行的代码,否则不要执行此操作。

如果 maxStackSize 小于最小堆栈大小,则使用最小堆栈大小。 如果不是 maxStackSize 页面大小的倍数,则会将其舍入到页面大小的下一个较大倍数。 例如,如果你使用的是 Windows Vista 上的 .NET Framework 版本2.0,则 262144 (的最小堆栈大小为64KB,) 为 64KB (65536 字节) 。

 备注

在 Windows XP 和 Windows Server 2003 之前的 Microsoft Windows 版本中, maxStackSize 将忽略,并使用可执行文件头中指定的堆栈大小。

如果指定非常小的堆栈大小,则可能需要禁用堆栈溢出探测。 当堆栈受到严格约束时,探测本身就会导致堆栈溢出。 若要禁用堆栈溢出探测,请将以下项添加到应用程序配置文件中。

<configuration>  
  <runtime>  
    <disableStackOverflowProbing enabled="true"/>  
  </runtime>  
</configuration>  

适用于

.NET 6.0 RC 1 和其他版本

建议的内容

  • 销毁线程

    了解需销毁 .NET 中的线程时的可选方法,例如协作取消或 Thread.Abort 方法。 了解如何处理 ThreadAbortException。

posted on 2023-02-09 09:24  不及格的程序员-八神  阅读(84)  评论(0编辑  收藏  举报