像'ps'和'top'这样的工具会报告各种内存使用情况,例如VM大小和Resident Set Size.但是,这些都不是"真正的"内存使用情况:
我发现Linux报告的私有脏RSS是最接近"真实"内存使用的东西.这可以通过对所有Private_Dirty值求和来获得/proc/somepid/smaps.
但是,其他操作系统是否提供类似功能?如果没有,有哪些替代方案?特别是,我对FreeBSD和OS X感兴趣.
我开发了一个简单的位置感知iPhone应用程序,除了在手机的低内存条件下,它在功能上非常符合我们的期望.
在手机内存不足的情况下我的应用程序崩溃了.如果我通过释放一些空间来增加手机内存,它会再次开始正常工作而不会发生任何崩溃.
当我在搜索问题时,我发现在低内存条件下操作系统会将didReceiveMemoryWarning发送到当前层次结构中的所有控制器,这样每个控制器都应该实现didReceiveMemoryWarning方法,并将iboutlet设置为nil.目前不可见.
我还读过一些地方,如果该控制器的视图不可见,将调用带有nil参数的方法setView,如果有一些附加到视图的出口变量,则删除它们会有问题.
因此,对于所有这些基金,通过实现didReceiveMemoryWarning和viewDidUnload方法处理Iphone引发的低级内存条件是最好的 .
如果可能,请提供适当的示例或链接以解决上述问题.
谢谢.
我知道在提交之前必须保留内存.当它被保留时,没有其他进程可以使用它.但是,保留的内存不计入可用的RAM.但不应该吗?因为如果没有其他人可以使用它,那么"可用"有什么用呢?
或者是否有更大的差异?
我正在使用Play构建一个Java Web应用程序!框架.我在playapps.net上托管它.在提供的内存消耗图表上,我一直困惑不已.这是一个示例:

该图表来自一致但名义上的活动期.我没有做任何事情来触发内存的衰减,所以我认为这是因为垃圾收集器运行,因为它几乎达到了允许的内存消耗.
我的问题:
System.gc(),范围从中性("它只是运行GC的请求,所以JVM可能只是忽略你")完全反对("依赖的代码System.gc()从根本上被打破") .或者我不在这里,我应该在我自己的代码中寻找导致此行为和间歇性性能损失的缺陷? 更新
我已经在PlayApps.net上开启了一个关于这个问题的讨论,并在这里提到了一些观点; 特别是@Affe关于完整GC设置非常保守的评论,以及@ G_H关于初始和最大堆大小设置的评论.
这是讨论的链接,但遗憾的是您需要一个playapps帐户才能查看.
当我得到它时,我会在这里报告反馈; 非常感谢大家的回答,我已经从中学到了很多东西!
解决方案
Playapps支持,这仍然很好,对我没有很多建议,他们唯一的想法是,如果我广泛使用缓存,这可能会使对象保持活动的时间超过需要,但事实并非如此.我还是学到了很多东西(呜呜!),我给了@Ryan Amos绿色支票,因为我提出了他System.gc()每半天打电话的建议,现在工作正常.
我按下了ALT + CMD + R并在Arguments> Environment Variables中激活了NSZombieEnabled.此外,我在诊断>内存管理>启用僵尸对象中激活它.
但是,当我构建并运行时,在某些时候我的应用程序崩溃,在控制台中给我这个无用的消息:
*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪也没用.我将细节级滑块一直向右移动.线程1只是告诉我这个:

一切都是系统所有,并没有一行与我的应用程序相关.所以很明显NSZombiesEnabled不能像在Xcode 3中那样工作,它停在死对象上.
有没有办法弄清楚哪个 CALayer过早解除分配?
更新:因此,在建立和运行大约100次后突然问题消失了!它完全消失了!最好的部分:我没有以任何方式修改我的代码!在中间我用clean命令清理了build文件夹和项目几次,并在Simulator中删除了几次app.
更新2:幸运的是问题再次出现.而现在似乎持久.幸运的是,因为我更喜欢找到根本原因,而不是随意地烦扰用户.
更新3:最后偶然发现它:
startButton = newBttn;
Run Code Online (Sandbox Code Playgroud)
本来应该:
self.startButton = newBttn;
Run Code Online (Sandbox Code Playgroud)
startButton是一个保留属性,在-dealloc我发布了它.因此,它在大多数(但不是全部)情况下得到了过度释放,在视图消失之后它崩溃了,给出了奇怪的CALayer retainCount消息.
Zombies Instrument(CMD + I)最终指出它与按钮有关.只是不知道为什么和在哪里.
Clang Static Analyzer没有抱怨这个明显的故障.
给定一个以复杂,循环,方式相互引用的类实例的聚合:垃圾收集器是否可能无法释放这些对象?
我模糊地回忆起这在过去的JVM中是一个问题,但我认为这在几年前已得到解决.然而,在jhat的一些调查显示,循环引用是我现在面临的内存泄漏的原因.
注意:我一直认为JVM能够解析循环引用并从内存中释放这些"垃圾岛".但是,我提出这个问题只是为了看看是否有人发现任何例外情况.
java memory garbage-collection memory-leaks memory-management
我正在使用Red Gates ANTS内存分析器来调试内存泄漏.它一直警告我:
内存碎片可能导致.NET保留过多的可用内存.
要么
内存碎片正在影响可以分配的最大对象的大小
因为我有强迫症,所以必须解决这个问题.
有哪些标准编码实践有助于避免内存碎片.你能通过一些.NET方法对其进行碎片整理吗?它会帮助吗?
目前我正在尝试使用Snap编写的一个小Haskell Web服务器来加载并向客户端提供大量数据.而且我非常非常难以控制服务器进程.在随机的瞬间,该过程使用大量的CPU几秒到几分钟,并且对客户端请求没有反应.有时内存使用量会在几秒钟内达到峰值(有时会下降)数百兆字节.
希望有人对使用大量内存的长时间运行的Haskell进程有更多的经验,并且可以给我一些指导以使事情更稳定.我已经调试了几天了,我开始有点绝望了.
我的设置概述:
在服务器启动时,我将大约5千兆字节的数据读入内存中的大型(嵌套)Data.Map相似结构.嵌套映射是值严格的,并且映射中的所有值都是数据类型,其所有字段也都是严格的.我花了很多时间确保没有留下未评估的thunk.导入(取决于我的系统负载)大约需要5-30分钟.奇怪的是连续运行的波动比我预期的要大,但这是一个不同的问题.
大数据结构存在于由"Snap"服务器生成的所有客户端线程共享的"TVar"中.客户端可以使用小型查询语言请求数据的任意部分.数据请求的数量通常很小(高达300kb左右),只接触数据结构的一小部分.所有只读请求都使用'readTVarIO'完成,因此它们不需要任何STM事务.
服务器使用以下标志启动:+ RTS -N -I0 -qg -qb.这将以多线程模式启动服务器,禁用空闲时间和并行GC.这似乎加快了这个过程.
服务器大多运行没有任何问题.但是,偶尔客户端请求会超时并且CPU达到100%(甚至超过100%),并且会持续这么长时间.同时服务器不再响应请求.
我可以想到几个可能导致CPU使用的原因:
请求只需要花费很多时间,因为还有很多工作要做.这有点不太可能,因为有时它会发生在先前运行中证明非常快的请求(快速我的意思是20-80ms左右).
在处理数据并将数据发送到客户端之前,仍然需要计算一些未评估的thunk.这也不太可能,原因与前一点相同.
以某种方式垃圾收集开始并开始扫描我的整个5GB堆.我可以想象这可能会花费很多时间.
问题是我不知道如何弄清楚究竟发生了什么,以及如何处理这个问题.因为导入过程花了这么长时间的分析结果,所以没有向我展示任何有用的东西.似乎没有办法从代码中有条件地打开和关闭探查器.
我个人怀疑GC是问题所在.我正在使用GHC7,它似乎有很多选项可以调整GC的工作原理.
在使用通常非常稳定的数据的大堆时,您建议使用哪些GC设置?
是否可以使用std::vector自定义结构分配对齐的内存以便使用SIMD指令进行进一步处理?如果有可能,有Allocator没有人碰巧有这样的分配器,他可以分享?
如果我分配一些内存使用malloc()是否有一种方法来标记它只读.因此,如果有人试图写入memcpy()会失败吗?
这与错误的api设计有关,用户错过了使用由GetValue()大型内存结构的一部分的方法返回的const指针 .由于我们希望避免复制大块内存,因此我们将实时指针返回到具有特定格式的结构化内存中.现在的问题是,有些用户通过直接写入这个内存来找到hack来实现工作,并避免使用SetValue()调用来进行分配并正确处理我们开发的内存二进制格式.虽然有时会破解工作,但有时它会因为用户已覆盖的控制标志的错误解释而导致内存访问冲突.
教育用户是一项任务,但我们现在要说,我们希望代码失败.
我只是想知道我们是否可以简单地防止这种情况.
为了类比,假设有人从sqlite语句中获取blob列,然后回写它.虽然在sqlite的情况下,它没有意义,但在我们的情况下这有点讨厌.