windows-vista – 关键部分在Vista / Win2008上泄漏内存?
发布时间:2020-12-14 02:53:05 所属栏目:Windows 来源:网络整理
导读:似乎在Vista / Windows Server 2008中使用关键部分导致操作系统无法完全恢复内存. 我们在Delphi应用程序中发现了这个问题,显然是因为使用了CS API. (见这 SO question) 有没有其他人用其他语言开发的应用程序(C,…)看到它? 示例代码只是初始化10000000 CS,
似乎在Vista /
Windows Server 2008中使用关键部分导致操作系统无法完全恢复内存.
我们在Delphi应用程序中发现了这个问题,显然是因为使用了CS API. (见这 SO question) 有没有其他人用其他语言开发的应用程序(C,…)看到它? 示例代码只是初始化10000000 CS,然后删除它们.这在XP / Win2003中运行良好,但在应用程序结束之前不会释放Vista / Win2008中的所有峰值内存. 解决方法
Microsoft确实改变了InitializeCriticalSection在Vista,Windows Server 2008以及可能还有Windows 7上的工作方式.
他们添加了一个“功能”,以便在分配一堆CS时保留用于调试信息的一些内存.分配的越多,保留的内存就越多.它可能是渐近的并最终变平(没有完全买到这个). 要避免此“功能”,您必须使用新的API InitalizeCriticalSectionEx并传递标志CRITICAL_SECTION_NO_DEBUG_INFO. 这样做的好处是它可能更快,因为通常只使用spincount而不必实际等待. 缺点是旧的应用程序可能不兼容,您需要更改代码,现在它依赖于平台(您必须检查版本以确定使用哪个版本).如果需要,你也失去了调试的能力. 用于冻结Windows Server 2008的测试工具包: #include "stdafx.h" #include "windows.h" #include <iostream> using namespace std; void TestCriticalSections() { const unsigned int CS_MAX = 5000000; CRITICAL_SECTION* csArray = new CRITICAL_SECTION[CS_MAX]; for (unsigned int i = 0; i < CS_MAX; ++i) InitializeCriticalSection(&csArray[i]); for (unsigned int i = 0; i < CS_MAX; ++i) EnterCriticalSection(&csArray[i]); for (unsigned int i = 0; i < CS_MAX; ++i) LeaveCriticalSection(&csArray[i]); for (unsigned int i = 0; i < CS_MAX; ++i) DeleteCriticalSection(&csArray[i]); delete [] csArray; } int _tmain(int argc,_TCHAR* argv[]) { TestCriticalSections(); cout << "just hanging around..."; cin.get(); return 0; } -…运行此批处理文件(需要来自服务器SDK的sleep.exe) @rem you may adapt the sleep delay depending on speed and # of CPUs @rem sleep 2 on a duo-core 4GB. sleep 1 on a 4CPU 8GB. @for /L %%i in (1,1,300) do @echo %%i & @start /min CSTest.exe & @sleep 1 @echo still alive? @pause @taskkill /im cstest.* /f -…并在启动300个实例之前看到一个8GB和四核CPU核心冻结的Win2008服务器.-…在Windows 2003服务器上重复并看到它像魅力一样处理它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows-server-2008-r2 – Windows Server 2008 R2中的远程
- windows-server-2008 – Linux管理员的Windows服务器管理资
- How to use Nissan consult 3 plus to check, make key and
- 在Windows 7上使用Powershell创建网络共享文件夹
- Microsoft Edge浏览器不支持收藏夹中的javascript bookmark
- BT之发布服务器和流量管理系统安装指南
- 汇编 – 使用3Dh会导致中断仅返回“已拒绝访问”
- 我可以限制Windows 2003/2008/2008 R2中的用户带宽/内存使用
- 替代Windows的Fsync c
- Office 365 REST Api和Microsoft Graph之间的区别
推荐文章
站长推荐
- APC Injection of Windows 7 x86 in R0
- 【旧文章搬运】Windows句柄表分配算法分析(二)
- windows-server-2003 – 将命令行重定向到自己的
- windows-server-2008 – Windows 2008-R2用户重新
- windows7解决无法桌面远程
- windows-server-2000 – 运行Windows Server 200
- windows-phone-8 – 如何在Windows Phone 8真实设
- 当区域设置时,Windows C运行时toupper会变慢
- Windows下php curl调用本地url 499问题
- mingw – 程序入口点_gxx_personality_v0无法在动
热点阅读