Vista/Win2008 上的关键部分泄漏内存?

2024-01-18

看来在 Vista/Windows Server 2008 中大量使用关键部分会导致操作系统无法完全重新获得内存。 我们在 Delphi 应用程序中发现了这个问题,这显然是因为使用了 CS API。 (看这个所以问题 https://stackoverflow.com/questions/780073/is-the-memory-not-reclaimed-for-delphi-apps-running-on-windows-server-2008-sp1)

有没有其他人在使用其他语言(C++,...)开发的应用程序中看到过它?

示例代码只是初始化 10000000 CS,然后删除它们。这在 XP/Win2003 中工作正常,但在 Vista/Win2008 中不会释放所有峰值内存,直到应用程序结束。
您使用 CS 的次数越多,您的应用程序无用地保留的内存就越多。


微软确实改变了方式InitializeCriticalSection适用于 Vista、Windows Server 2008,也可能适用于 Windows 7。
他们添加了一个“功能”,当您分配一堆 CS 时,可以保留一些用于调试信息的内存。分配的内存越多,保留的内存就越多。它可能是渐近的,并最终趋于平缓(没有完全相信这一点)。
为了避免这个“功能”,你必须使用新的 API初始化CriticalSectionEx http://msdn.microsoft.com/en-us/library/ms683477(VS.85).aspx并传递旗帜CRITICAL_SECTION_NO_DEBUG_INFO.
这样做的优点是它可能会更快,因为通常只使用旋转计数而无需实际等待。
缺点是您的旧应用程序可能不兼容,您需要更改代码,它现在依赖于平台(您必须检查版本以确定使用哪一个)。如果需要的话,您也将失去调试的能力。

冻结 Windows Server 2008 的测试套件:
- 将此 C++ 示例构建为 CSTest.exe

#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

-...并看到具有 8GB 和四核 CPU 的 Win2008 服务器在达到启动的 300 个实例之前冻结。
-...在 Windows 2003 服务器上重复,您会发现它处理得非常顺利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vista/Win2008 上的关键部分泄漏内存? 的相关文章

  • 使用 py2exe 在 .exe 中嵌入图标,在 Vista 中可见?

    我一直在尝试使用 py2exe 将图标 ico 嵌入到我的 编译 exe 中 Py2Exe 确实有一种嵌入图标的方法 windows script MyScript py icon resources 1 MyIcon ico 这就是我正在
  • iPhone应用程序NSNumber内存泄漏

    我遇到了内存泄漏 但我不知道它从哪里来以及如何修复它 在某些时候 我计算两个位置之间的距离 double calc self getDistance location to otherLocation NSNumber distance N
  • TWebbrowser 大量内存泄漏:到目前为止还没有解决方案

    我有一个使用的应用程序TWebbrowser定期导航到特定 URL 并提取一些数据 该应用程序 24x7 持续运行 并在页面中进行大量导航 问题是TWebbrowser有一个众所周知的内存泄漏问题 每次导航到新页面时 应用程序使用的内存都会
  • 线程关闭期间 Win64 Delphi RTL 中的内存泄漏?

    很长一段时间以来 我注意到我的服务器应用程序的 Win64 版本存在内存泄漏问题 虽然 Win32 版本工作正常 内存占用相对稳定 但 64 位版本使用的内存却定期增加 可能 20Mb 天 没有任何明显的原因 不用说 FastMM4 没有报
  • 我的程序有内存泄漏

    IBAction play2 CFBundleRef mainBundle CFBundleGetMainBundle CFURLRef soundFileURLRef soundFileURLRef CFBundleCopyResourc
  • Swift 2:IBOutlet 集合 [UIButton]!内存泄漏

    最近在我的应用程序中 我发现我的 UIButton 出口集合正在泄漏内存 我所拥有的只是 IBOutlet var TabBarButtons UIButton And from Instrument 谁能告诉我出了什么问题吗 随着时间的推
  • 内存泄漏?!在“array_map”中使用“create_function”时,垃圾收集器是否正确?

    我在 StackOverflow 上找到了以下解决方案 从对象数组中获取特定对象属性的数组 PHP 从对象数组中提取属性 https stackoverflow com questions 1118994 php extracting a
  • NET/COM 互操作的 ref string[] 内存泄漏

    我最近发现一个非常奇怪的 对我来说 内存泄漏IEnumString http msdn microsoft com en us library ms693735 28VS 85 29 aspxC 使用的 COM 对象 具体来说 使用已包含先
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • 当您使用 .html() 删除元素时,jQuery 中的事件侦听器是否会自动删除?

    在 jQuery 中如果我们使用 remove 如果要删除某些元素 则与该元素关联的所有绑定事件和 jQuery 数据都将被删除 但是如果我们用以下命令 删除 元素会发生什么 html 我们是否需要在更改任何 html 之前取消绑定所有元素
  • Vista 中的文本转语音

    我通过在 2000 NT XP 中使用 Delphi 创建 OLE 对象来做到这一点 如下所示 Voice CreateOLEObject SAPI SpVoice Voice speak 但这在 Vista 中不起作用 我怎样才能让我的程
  • Android - 内存泄漏还是?

    两天前我注意到一些事情 我在地图活动上有一个旋转器 在活动的 OnCreate 方法中 我用数据填充微调器 之后 我在 DDMS 中启动堆分析器 开始打开 关闭微调器 我注意到当我打开旋转项时虚拟机分配内存 但是当我关闭它时 虚拟机不会释放
  • IIS 7.0和win2k8中有多少个不同的地方需要设置日期格式

    我正在尝试使用 win2k8 将旧的经典 asp 应用程序迁移到 IIS 7 0 如果可以的话 我绝对不想更改旧代码 我在日期格式的自定义区域选项中设置了日期格式 在控制面板中的区域和语言选项中将其更改为 dd MMM yy 我仍然收到 C
  • IE 6 中存在内存泄漏的大型 Web 应用程序

    我有一个巨大的网络应用程序在 IE 6 中存在内存泄漏问题 修复演示该问题的 5 行代码示例中的内存泄漏很容易 但如果我有一个非常庞大的应用程序 应该从哪里开始呢 查看Drip http sourceforge net projects i
  • 禁用“应用程序已停止工作”窗口

    我们获得了 NET WCF 服务 理想情况下该服务应具有 100 的正常运行时间 但有时我们的应用程序中会出现由第三方数据库连接组件引起的内存泄漏问题 我们配置 nnCron 来监视进程是否存在 并且当该服务的进程退出时 它应该再次启动它
  • Windows XP 和 Vista 编程之间的主要区别是什么?

    从桌面应用程序开发人员的角度来看 Windows XP 开发和 Windows Vista 开发之间有什么区别吗 用户界面 看着Windows Vista 用户体验指南 http msdn microsoft com en us libra
  • C# WPF 中的内存泄漏

    在处理所有使用过的对象后 我需要减少 c WPF 中的内存泄漏 但我无法通过使用以下代码片段完全减少内存消耗 这是我的代码 string str Uri uri private void Button Click object sender

随机推荐

  • MongoDB InvalidDocument:无法对对象进行编码

    我正在使用 scrapy 来抓取博客 然后将数据存储在 mongodb 中 起初我得到了 InvalidDocument 异常 对我来说很明显的是数据的编码不正确 因此 在持久化对象之前 在我的 MongoPipeline 中 我检查文档是
  • 如何合并数组并保留键?

    我有两个数组 array1 array a gt 1 b gt 2 c gt 3 array2 array d gt 4 e gt 5 f gt 6 a gt new value 123 gt 456 我想合并它们并保留键和顺序而不是重新索
  • Xcode 在打字时滚动文本

    Xcode 今天似乎做了一些烦人的事情 我喜欢编辑源代码 这样我就可以在 Xcode 窗口的垂直中心大致输入内容 我不喜欢在窗口底部或顶部附近键入 因为它隐藏了我正在忙于编辑的代码之前或之后的代码 最近 在编辑实现文件时 Xcode 习惯于
  • Oracle CONNECT BY 递归子到父查询,包括自引用的最终父级

    在下面的例子中 id parent id A A B A C B select id parent id from table start with id A connect by nocycle parent id prior id I
  • 在 Access 中导入 .sql 文件

    我需要导入使用 MySql 创建的 sql 数据库备份文件 有办法执行此操作吗 您无法将 MySQL 备份恢复到任何其他数据库系统中 如果要将 MySQL 数据导入到 Access 中 可以将其全部导出到 CSV 文件中 然后将其导入到 A
  • UWP TextBox 文本绑定不起作用

    我在 UWP 中使用 TextBox Text 绑定时遇到一些问题 我已经从事 WPF 多年 通常知道我在 XAML 中做什么 但无法让此绑定发挥作用 我在 XAML 中的同一范围内有一个文本框和一个按钮
  • 如何避免打开两个浏览器窗口?

    我想避免打开两个应用程序窗口 或选项卡 的可能性 是的 如果我的应用程序 LAMP Javascript 安装在http www domain com并且用户正在浏览页面http www domain com user 他 她无法打开另一个
  • 是否可以将 .Net DLR 托管在“防白痴”沙箱中?

    我想以这样一种方式托管动态语言运行时 DLR 以便在其中运行任意脚本的用户无法关闭该进程 The DLR 托管规范 https web archive org web 20110814193317 http dlr codeplex com
  • pthread_create() 的返回码是 11

    我正在尝试运行一个简单的多线程编程 但我从 gcc 收到此错误 pthread create 的返回码是 11 我该如何解决这个问题 include
  • 平面图布局

    布局图形时有哪些边缘重叠最小化技术 最好与 GraphViz 相关 还有现有的软件可以以平面方式布局图形吗 当前布局 http www evecakes com doodles master gif http www evecakes co
  • PHP 中奇怪的回显、打印行为?

    以下代码输出43211 why echo print 3 2 print 4 你的语句解析对人类如下 回显由以下内容组成的串联字符串 函数的结果print 3 这将返回 true 它被字符串化为1 字符串 2 函数的结果print 4 这将
  • 如何在子流程中包含弹出对话框

    有没有办法在子流状态内调用对话框 以便禁用背景 当前流 这样当子流程结束时 关闭弹出对话框后 它就可以更新父流程 当前页面 我正在尝试使用子流程实现如下图所示的效果 Update 最后 我在 webflow 中使用了以下代码来动态生成对话框
  • amphp 是如何工作的

    他们网站上的文档http amphp org faq http amphp org faq我不太清楚 事情让我很困惑 它打算作为服务器运行吗 或作为 CLI 运行 或者在 Web 容器 apache nginx fpm 中运行 php 本质
  • 收到错误:图形 API 版本不匹配

    当我运行时出现以下错误shiny Error Graphics API version mismatch Listening on http 127 0 0 1 3774 Warning Error in Cairo Graphics AP
  • Collections.sort() 比较方法违反了 Java 中的一般约定[重复]

    这个问题在这里已经有答案了 我知道这种问题已经被问过数百万次 如果不是数十亿次 但我还找不到答案 This compare 方法没有Long Double Float 它只有Date boolean and Null检查员 但是它告诉我co
  • 如何获取和设置 EmguCV Mat 图像的像素值?

    我正在使用 OpenCV 3 0 库的 EmguCV 3 0 0 包装器 我正在使用Mat在几个地方上课 这是一个单通道 8x8 图像的示例double values Mat image new Mat 8 8 DepthType Cv64
  • 主键中允许 NULL - 为什么以及在哪个 DBMS 中?

    进一步我的问题 为什么在 SQL 中使用 非空主键 https stackoverflow com questions 3905703 why to use not null primary key in tsql As I underst
  • 学习 monodevelop 并且无法显示消息框

    我正在 monodevelop 工作并学习 c 我试图显示一个消息框 但无法使其正常运行 这是我的代码 using System using Gtk using GtkSharp public partial class MainWindo
  • SwiftUI:VStack/HStack/ZStack 拖动手势不起作用

    我不明白为什么DragGesture不适用于 VStack HStack ZStack 考虑以下简单示例 struct ContentView View State private var offset CGSize zero var bo
  • Vista/Win2008 上的关键部分泄漏内存?

    看来在 Vista Windows Server 2008 中大量使用关键部分会导致操作系统无法完全重新获得内存 我们在 Delphi 应用程序中发现了这个问题 这显然是因为使用了 CS API 看这个所以问题 https stackove