使用内存分析

Posted

技术标签:

【中文标题】使用内存分析【英文标题】:Use of Memory Profiling 【发布时间】:2015-05-01 05:16:14 【问题描述】:

内存分析是什么意思?

它是否提供内存统计信息,例如使用了多少内存?

这里面有什么不同的种类吗?

【问题讨论】:

例如,如果您正在调试一个应用程序并且该应用程序分配内存来创建结构或取消分配内存以释放未使用的结构,您可能想知道哪些结构使用了多少内存并且您可能希望实时监控此信息,例如,以避免由于编程错误而消耗所有可用内存。 en.wikipedia.org/wiki/Profiling_%28computer_programming%29 【参考方案1】:

问题是,您可能正在做很多新的事情,即使在带有垃圾收集器的语言中,也可能不必要地支配您的执行时间。 您还可能遇到内存泄漏,这意味着您没有返回到池中的动态内存量会随着时间的推移而稳定增长。 如果你的应用运行时间很长,那同样糟糕。

我使用random-pausing 方法进行性能诊断,但这对于查找内存泄漏没有任何价值。 这就是内存分析应该提供的帮助。

这是我过去使用 MFC 发现内存泄漏的方法。 在调试版本中,当我关闭应用程序时,它会打印所有未收集的内存块的列表,以及它们的类类型。 然后我查看这些块是在哪里创建的,并试图找出它们没有被删除或收集的原因。 如果我可以捕获每个块上的堆栈跟踪会更有用,这样我就可以分辨出哪个new 语句做了它,堆栈可以告诉我原因。 关键是,我可以分配 100 个 Foo 类块,并删除其中的 99 个。 我没有删除的是问题所在,因此了解更多关于它的来源会很有用。 我不知道内存分析器是否可以做到这一点。

【讨论】:

以上是关于使用内存分析的主要内容,如果未能解决你的问题,请参考以下文章

JVM技术专题 深入分析回顾堆外内存使用和分析「分析篇」

使用MAT分析Java内存

Netty源码分析(七) PoolChunk

Android端 APP 内存分析使用工具进行APP的内存分析

android 内存分析

Windows 逆向使用 CE 分析内存地址 ( 运行游戏 | 使用 CE 工具分析游戏内子弹数量对应的内存地址 | 内存地址初步查找 | 使用二分法定位最终的内存地址 )