问题标签 [memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
15 回答
37853 浏览

c++ - Win32下的堆损坏;如何定位?

我正在开发一个破坏堆的多线程C++ 应用程序。定位这种损坏的常用工具似乎不适用。源代码的旧版本(18 个月大)表现出与最新版本相同的行为,所以这已经存在很长时间了,只是没有被注意到;不利的一面是,源增量不能用于识别何时引入错误 -存储库中有很多代码更改。

崩溃行为的提示是在该系统中生成吞吐量 - 数据的套接字传输,该数据被转换为内部表示。我有一组测试数据会定期导致应用程序异常(各种地方,各种原因 - 包括堆分配失败,因此:堆损坏)。

该行为似乎与 CPU 功率或内存带宽有关;每台机器拥有的越多,就越容易崩溃。禁用超线程内核或双核内核会降低(但不会消除)损坏率。这暗示了一个与时间相关的问题。

现在问题来了:
当它在轻量级调试环境(比如Visual Studio 98 / AKA MSVC6)下运行时,堆损坏相当容易重现 - 十到十五分钟后,某些事情会发生可怕的失败和异常,例如alloc;在复杂的调试环境下运行时(Rational Purify,VS2008/MSVC9甚至微软应用程序验证程序)系统成为内存速度限制并且不会崩溃(内存限制:CPU没有超过50%,磁盘灯不亮,程序运行速度尽可能快,消耗1.3G2G RAM的盒子) . 因此,我可以在能够重现问题(但不能识别原因)或能够识别原因或我无法重现的问题之间做出选择。

我目前对下一步的最佳猜测是:

  1. 获得一个疯狂的盒子(替换当前的开发盒:2Gb RAM in an E6550 Core2 Duo);这将使在强大的调试环境下运行时重现导致错误行为的崩溃成为可能;或者
  2. 重写操作符new,并delete在完成后立即使用VirtualAlloc并将VirtualProtect内存标记为只读。运行MSVC6并让操作系统捕获正在写入释放内存的坏人。是的,这是绝望的迹象:到底是谁重写newdelete?!我想知道这是否会使它像 Purify 等人一样慢。

而且,不:不能选择内置 Purify 仪器。

一位同事刚刚走过,问“堆栈溢出?我们现在堆栈溢出了吗?!?”

现在,问题是:我如何找到堆损坏器?


更新:平衡new[]delete[]似乎在解决问题方面取得了长足的进步。现在,该应用程序在崩溃前大约需要两个小时,而不是 15 分钟。还没有。有什么进一步的建议吗?堆损坏仍然存在。

更新:Visual Studio 2008 下的发布版本似乎要好得多;STL目前的怀疑取决于VS98.


  1. 重现问题。Dr Watson将产生一个可能有助于进一步分析的转储。

我会记下这一点,但我担心 Watson 博士只会在事后被绊倒,而不是在堆被踩踏时。

另一种尝试可能是WinDebug用作调试工具,它非常强大,同时也是轻量级的。

现在又开始了:在出现问题之前没有太多帮助。我想在行为中抓住破坏者。

也许这些工具至少可以让您将问题缩小到某个组件。

我不抱太大希望,但绝望的时候需要...

您确定项目的所有组件都具有正确的运行时库设置(C/C++ tabVS 6.0 项目设置中的代码生成类别)吗?

不,我不是,明天我将花几个小时浏览工作区(其中有 58 个项目)并检查它们是否都在编译并与适当的标志链接。


更新:这需要 30 秒。选择对话框中的所有项目Settings,取消选择,直到找到没有正确设置的项目(它们都有正确的设置)。

0 投票
14 回答
35452 浏览

iphone - 使用 Cocoa 和 Objective-C 理解引用计数

我刚刚开始研究 Objective-C 和 Cocoa,以便使用 iPhone SDK。我对 Cmallocfree概念相当满意,但 Cocoa 的引用计数方案让我很困惑。有人告诉我,一旦你理解它,它就非常优雅,但我还没有完全理解它。

和如何release工作以及它们的使用约定是什么?retainautorelease

(或者失败了,你读到了什么帮助你得到它?)

0 投票
12 回答
15459 浏览

c++ - 内存管理、堆损坏和 C++

所以,我需要一些帮助。我正在使用 C++ 开发一个项目。但是,我想我已经设法破坏了我的堆。这是基于我将 an 添加std::string到一个类并为它分配另一个值的事实std::string

我的系统因堆栈转储而崩溃。所以基本上我需要停下来检查我所有的代码和内存管理的东西,找出我搞砸的地方。代码库仍然很小(大约 1000 行),所以这很容易做到。

尽管如此,我还是对这种东西感到头疼,所以我想我会把它扔在那里。我在 Linux 系统上使用valgrind,虽然不完全知道我在做什么,但它确实报告了std::string' 的析构函数是无效的。我不得不承认从谷歌搜索中得到了“堆损坏”这个词;任何关于这类东西的通用文章也将不胜感激。

(在之前rm -rf ProjectDir,在 C# 中再次执行:D)

编辑:我还没有说清楚,但我要的是诊断这类内存问题的建议。我知道 std::string 的东西是正确的,所以这是我做过的事情(或者是一个错误,但 Select 没有问题)。我确信我可以检查我编写的代码,你们非常聪明的人很快就会发现问题,但我想将这种代码分析添加到我的“工具箱”中,就像它一样。

0 投票
5 回答
2598 浏览

javascript - Firefox 3 中的某种 JavaScript 任务管理器?

最近我在 Ubuntu Hardy Heron 上遇到了 Firefox 3 的问题。

我将单击一个链接,它会挂起一段时间。我不知道它是 Firefox 3 中的错误还是运行过多客户端 JavaScript 的页面,但我想尝试调试一下。

所以,我的问题是“有没有办法为 Firefox 3 提供某种进程浏览器或任务管理器之类的东西?”

我希望能够通过该页面上的 JavaScript(或页面中导致 CPU/内存使用的任何内容)查看哪些选项卡正在使用我的处理器的百分比。

有人知道这样做的插件或类似的东西吗?有没有其他人以另一种方式进行过这种检查?

我知道 FireBug,但我无法想象如何使用它来确定哪个选项卡正在使用大量资源。

有什么建议或见解吗?

0 投票
13 回答
8511 浏览

c++ - C++ 中的安全内存分配器

我想创建一个分配器,它提供具有以下属性的内存:

  • 无法分页到磁盘。
  • 很难通过附加的调试器访问

这个想法是这将包含用户应该无法访问的敏感信息(如许可证信息)。我已经在网上进行了通常的研究,并就此询问了其他一些人,但我找不到一个很好的起点来解决这个问题。

更新

Josh提到了使用VirtualAlloc来设置内存空间的保护。我创建了一个自定义分配器(如下所示)我发现使用VirtualLock它限制了我可以分配的内存量。这似乎是设计使然。因为我将它用于小物体,所以这不是问题。

并且被使用

Ted Percival提到了 mlock,但我还没有实现。

我发现Neil Furguson 和 Bruce Schneier 的 Practical Cryptography 也很有帮助。

0 投票
3 回答
924 浏览

asp.net - 在非生产环境中复制与负载相关的崩溃

我们正在我们的 Intranet 上运行一个自定义应用程序,我们在最近升级它后发现一个问题,即 IIS 以 100% 的 CPU 使用率挂起,需要重置。

在确定解决方案时,我们回滚到以前的版本,而不是让用户陷入困境。第一步是重现问题——但我们不能。

这里有一些背景:

Prod 有一个带有两个 CPU 和 2 GB RAM 的虚拟化 (vmware) Web 服务器。数据库服务器有 4GB,还有 2 个 CPU。它也在 VMWare 上,但在单独的物理硬件上。

在正常使用期间,应用程序运行良好。w3wp.exe 进程通常使用 5-20% 的 CPU 和大约 200MB 的 RAM。CPU 和 RAM 在正常使用情况下略有波动,但没有异常。

然而,当我们开始遇到问题时,RAM 急剧攀升,CPU 稳定在 98%(或尽可能多)。该站点变得无响应,需要重新启动 IIS。在这种情况下,重置应用程序池不起作用,需要完全重新启动 IIS。

它不会在夜间发生(不使用)。当站点处于负载状态时,这种情况发生得更多,但它也发生在非高峰期。

解决这个问题的第一步是重现它。为了模拟负载,我们开始使用 JMeter 来模拟使用。我们的加载脚本基于崩溃时的实际使用情况。使用 JMeter,我们可以提高使用率(崩溃期间负载的 2-3 倍),但站点运行良好。CPU 很高,站点确实变得缓慢,但内存使用量合理,没有任何问题。

有没有人有关于如何在非生产环境中重现此类问题的任何提示?我们真的很想重现错误,确定解决方案,然后再次测试以确保我们已经解决了它。在这个过程中,我们发现了一些我们已经改进的小东西可能会解决问题,但是如果我们能够重现问题并测试改进的版本,我真的会更有信心。

非常感谢任何工具、技术或理论!

0 投票
8 回答
18044 浏览

c - 在 OS X 中读取其他进程的内存?

我一直在尝试了解如何在 Mac OS X 上读取其他进程的内存,但我运气不佳。我在网上看到了很多使用ptracewith等的示例,但是它在 BSD [ ]PEEKDATA上没有该选项。man ptrace

如何在 Mac OS X 上读取和写入另一个进程的内存?

0 投票
4 回答
8807 浏览

.net - 在 .NET Web 服务中保存数据的最佳方式

我有一个从这个 json 文件查询数据的 Web 服务,但我不希望 Web 服务每次都访问该文件。我在想也许我可以将数据存储在其他地方(也许在内存中),这样 Web 服务下次尝试查询相同数据时就可以从那里获取数据。我有点明白需要做什么,但我只是不确定如何实际去做。我们如何在 Web 服务中持久化数据?

更新: 缓存和使用静态变量的建议看起来都不错。也许我应该同时使用两个,这样我就可以先看一个,如果它不在那里,使用第二个,如果它也不在那里,那么我会看看 json 文件。

0 投票
20 回答
80180 浏览

.net - 如何在.net中配置一个类?

.NET 垃圾收集器最终会释放内存,但如果您想立即恢复内存怎么办?你需要在类中使用什么代码MyClass来调用

并通过变量和对象释放所有使用的空间MyClass

0 投票
11 回答
6373 浏览

.net - 使用附加行为防止内存泄漏

我在我的 WPF 应用程序中创建了一个“附加行为”,它允许我处理 Enter 按键并移动到下一个控件。我称之为 EnterKeyTraversal.IsEnabled,你可以在我的博客上看到代码

我现在主要担心的是我可能有内存泄漏,因为我正在处理 UIElements 上的 PreviewKeyDown 事件并且从未明确地“取消挂钩”该事件。

防止这种泄漏的最佳方法是什么(如果确实有的话)?我是否应该保留我正在管理的元素的列表,并在 Application.Exit 事件中解开 PreviewKeyDown 事件?有没有人在他们自己的 WPF 应用程序中使用附加行为取得成功,并提出了一个优雅的内存管理解决方案?