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

12/29/2020

本文内容

本文介绍由本机 IIS 进程创建的线程的默认最大堆栈Microsoft Internet Information Services (IIS) 大小。

原始产品版本:   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 函数以指定线程的堆栈大小。

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