16

我知道这个问题的答案可能取决于注册表设置和 Windows 的版本,如果内存不足,可能还取决于 RAM 的数量。为了这个问题,假设服务器有足够的 RAM (3+ GiB)。

如果一个应用程序(在这种情况下是第三方应用程序)每小时泄漏几百个句柄,那么在其他应用程序遇到麻烦之前,该应用程序可以泄漏多少个句柄?我所说的“麻烦”是指,例如,无法启动线程、无法打开文件等等。

我已经看到一些服务器(轻负载)在使用数万个句柄的进程(通常是数据库进程)上运行得很好,所以旧的 10000 个句柄限制显然不是这里的问题。(无论如何,这是一个每个进程的限制,所以不会影响我的应用程序,这远远低于这一点。)

有人可以回答这个问题或向我指出一些资源,这些资源可以解释在您有效用完(句柄或其他系统资源)之前,Windows 服务器将允许多少个总句柄?

4

5 回答 5

21

请参阅Raymond Chen 关于此主题的帖子。窗口管理器强制每个进程限制为 10K,并且整个系统的总限制为 32K。因此,如果它每小时“仅”泄漏 100 个句柄,那么在它开始出现异常之前,您有几天的正常运行时间。

请注意,并非所有句柄都是平等的。例如,窗口句柄不是数据库句柄,并且可能遵循不同的规则。因此,此限制可能不适用,具体取决于程序泄漏的句柄类型。另请阅读此博客文章。

于 2009-06-04T15:57:53.830 回答
6

桌面堆,它是一个内存池,句柄代表生命的真正“东西” 。有时与其说分配了多少句柄,不如说是该句柄下的每个对象使用了多少内存。您可以通过这种方式调试堆。安装起来很痛苦

(这是从我的另一个答案中回收的)

于 2009-06-04T15:58:19.413 回答
5

由于这些值可能会随着新的 Windows 版本而改变,因此您可以使用 SysInternals 工具TestLimit/TestLimit64来粗略估计。x64版本可能会运行一段时间,尤其是内存测试(它可能会使用硬盘(交换文件)来获得更多的虚拟内存)。

http://live.sysinternals.com/WindowsInternals/http://download.sysinternals.com/files/TestLimit.zip获取工具

命令行选项:

-p check process limit
-t check thread limit
-h check handle limit
-u check user handle limit
于 2015-01-07T23:10:18.930 回答
5

根据最近的这篇博客文章16*1024*1024,Windows 10 中进程的总句柄限制硬编码为16,777,216

由于Windows 执行程序另请参见此处)还存储有关句柄的一些跟踪信息,因此64 位 Windows 10的实际限制为16,711,680 ,而 32 位 Windows 10 的实际限制为16,744,448

执行程序在页面大小的块中按需分配句柄表,并将其划分为句柄表条目。这意味着在 x86 和 x64 上都是 4096 字节的页面可以在 32 位 Windows 上存储 512 个条目,在 64 位 Windows 上可以存储 256 个条目。执行程序通过将硬编码的最大值 16,777,216 除以页面中的句柄条目数来确定分配给句柄条目的最大页数,结果在 32 位 Windows 上为 32,768,在 64 位 Windows 上为 65,536 . 因为Executive使用每个页面的第一个条目作为自己的跟踪信息,一个进程可用的句柄数实际上是16,777,216减去这些数字,这解释了Testlimit获得的结果:16,777,216-65,536是16,711,680和16,777,216-65,536-32,768是 16,744,448。

于 2020-01-21T14:57:34.860 回答
2

据此 10000。

于 2009-06-04T15:53:29.383 回答