我理解这个问题的答案可能取决于注册表设置和Windows版本,如果没有足够的内存,可能取决于RAM的数量。为了这个问题,假设服务器有足够的RAM(3 + GiB)。
如果一个应用程序(在这种情况下是第三方应用程序)以几百小时的时间泄漏句柄,那么该应用程序在其他应用程序遇到问题之前会泄漏多少总句柄? “麻烦”我的意思是,例如,无法启动线程,无法打开文件等等。
我已经看到一些服务器(轻载)运行得很好,一个进程(通常是一个数据库进程)使用几万个句柄,所以旧的10000句柄限制显然不是问题。 (无论如何,这是一个每个进程的限制,因此不会影响我的应用程序,在这一点下。)
有人可以回答这个问题,还是指出一些资源,解释一下Windows服务器在你有效用完(句柄或其他系统资源)之前允许的总处理数量?
答案 0 :(得分:16)
见Raymond Chen's post on this topic。窗口管理器强制每个进程限制10K,并且整个系统的总限制为32K。因此,如果它“每小时”只泄漏100个手柄,那么在它开始行为不端之前你有几天的正常运行时间。
请注意,并非所有句柄都相同。例如,窗口句柄不是DB句柄,可能遵循不同的规则。因此,此限制可能不适用,具体取决于程序泄漏的句柄类型。 Also read this blog post.
答案 1 :(得分:5)
desktop heap,这是一个内存池,其中句柄所代表的真实“东西”就是生命。 有时并没有分配多少句柄,而是在该句柄下每个对象使用多少内存。您可以调试堆this way。它是pain安装。
(这是从我的另一个答案中回收的)
答案 2 :(得分:4)
由于这些值可能会随着新的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
答案 3 :(得分:3)
根据this recent blog post,Windows 10中某个进程的总句柄限制硬编码为16*1024*1024
或 16,777,216 。
由于Windows Executive(see also here)还存储了有关句柄的一些跟踪信息,因此,对于64位Windows 10和 16,744,448,实际限制为 16,711,680 em>对于32位Windows 10:
执行程序按需在页面大小的块中分配句柄表,并将其分成句柄表条目。这意味着一个页面(在x86和x64上均为4096字节)在32位Windows上可以存储512个条目,在64位Windows上可以存储256个条目。执行程序通过将硬编码的最大值16,777,216除以页面中的句柄条目数,来确定要分配给句柄条目的最大页面数,这在32位Windows上为32,768,而在64位Windows上为65,536 。由于执行人员将每个页面的第一项用于自己的跟踪信息,因此流程可用的句柄数实际上是16,777,216减去这些数字,这解释了Testlimit获得的结果:16,777,216-65,536是16,711,680和16,777,216-65,536-32,768是16,744,448。
答案 4 :(得分:2)
根据this,10000。