草庐IT

windows - 强制 Windows 在某些地方加载 DLL,以使内存碎片最少

coder 2023-11-10 原文

我的应用程序需要大量内存和大数据结构才能执行其工作。 应用程序通常需要超过 1 GB 的内存,在某些情况下,我的客户确实需要使用 64 位版本的应用程序,因为他们有几 GB 的内存。

在过去,我可以很容易地向用户解释,如果内存达到 1.6 到 1.7 GB 的内存使用量,那就是“内存不足”或非常接近“内存不足”的情况,他们需要减少他们的内存或移动到 64 位版本。

去年我注意到应用程序通常只使用了大约 1 GB 就已经耗尽内存。经过一些调查,这个问题的原因似乎是内存碎片。我使用 VMMAP(一种 SysInternals 实用程序)查看我的应用程序的内存使用情况,并看到如下内容:

橙色区域是我的应用程序分配的内存。紫色区域是可执行代码。

正如您在图像的下半部分看到的那样,紫色区域(即 DLL)被加载到许多不同的地址,导致我的内存碎片化。如果我的客户没有大量数据,这并不是真正的问题,但如果我的客户的数据集占用超过 1 GB,并且应用程序的一部分需要大块内存(例如 50 MB),它可能会导致内存分配失败,从而导致我的应用程序崩溃。

我的大部分数据结构都是基于 STL 的,通常不需要大块的连续内存,但在某些情况下(例如非常大的字符串),确实需要有一个连续的内存块。不幸的是,并不总是可以更改代码以使其不需要这样一个连续的内存块。

问题是:

  • 如何在不对客户计算机上的所有 DLL 显式使用 REBASE 或不显式加载所有 DLL 的情况下影响 DLL 在内存中的加载位置。
  • 有没有办法在您自己的应用程序 list 文件中指定 DLL 的加载地址?
  • 或者有没有办法告诉 Windows(通过 list 文件?)不要分散 DLL(我认为这种分散称为 ASLR)。

当然,最好的解决方案是我可以从我的应用程序的 list 文件中进行影响的解决方案,因为我依赖于 Windows 对 DLL 的自动/动态加载。

我的应用程序是一个混合模式(托管+非托管)应用程序,尽管应用程序的主要部分是非托管的。

有什么建议吗?

最佳答案

首先,您的虚拟地址空间碎片不一定会导致内存不足的情况。如果您的应用程序必须分配适当大小的连续 内存块,就会出现这种情况。否则碎片的影响应该很小。

您说您的大部分数据都是“基于 STL 的”,但是如果例如您分配了一个巨大的 std::vector,您将需要一个连续的内存块。

据我所知,无法在加载时指定 DLL 的首选映射地址。所以只有两个选择: rebase (rebase)(DLL 文件),或者自己实现 DLL 加载(当然这不是微不足道的)。

通常您不需要对标准 Windows API DLL 进行 rebase ,它们会非常紧密地加载到您的地址空间中。碎片可能来自某些第 3 方 DLL(例如 Windows 钩子(Hook)、防病毒注入(inject)等)

关于windows - 强制 Windows 在某些地方加载 DLL,以使内存碎片最少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8170502/

有关windows - 强制 Windows 在某些地方加载 DLL,以使内存碎片最少的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  7. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐