如何测量数据结构的内存使用情况? [复制]

Posted

技术标签:

【中文标题】如何测量数据结构的内存使用情况? [复制]【英文标题】:How to measure memory usage of a data structure? [duplicate] 【发布时间】:2014-05-11 06:42:31 【问题描述】:

我将 Trie 与存储英文单词的 HashMap 进行比较,超过 100 万。加载数据后,仅执行查找。我正在编写代码来测试速度和内存。速度似乎很容易衡量,只需记录测试代码前后的系统时间。

衡量一个对象的内存使用的方法是什么?在这种情况下,它是 Trie 和 HashMap。我观察了系统性能监视器并在 Eclipse 中进行了测试。操作系统性能监视器显示我的测试程序启动后使用了超过 1G 的内存。我怀疑存储数据需要这么多内存的事实。

另外,在我的 Windows 机器上,它显示内存使用量在整个测试期间不断上升。这不应该发生,因为数据的初始加载时间很短。之后,在查找短语期间,不应再有任何额外的内存消耗,因为不会创建新对象。在 linux 上,内存使用似乎更稳定,虽然也增加了一些。

你能分享一些关于这个的想法吗?非常感谢。

【问题讨论】:

您是否要测量the size of your data structure in memory? 根据您的 trie 实现,一百万个条目可能需要 1G。但是由于您没有显示任何代码,因此任何人都不可能给您分析。或者,您可以进行堆转储并将属于您的 trie 的部分加在一起。获取堆转储的说明是here。 【参考方案1】:

简短的回答是:你不能。 长答案是:您可以通过在测试前后多次重复调用 GC 的差异内存分析来计算内存中对象的大小。但即便如此,也只有非常大的数字或回合才能接近实际大小。您首先需要一个热身阶段,即使所有接缝都可以顺利工作,您也可能会陷入 jit 和其他您不知道的优化。

一般来说,计算您使用的对象数量是一个很好的经验法则。

如果您的树实现使用对象作为表示数据的结构,那么与地图相比,您的内存消耗很可能很高。

如果您浪费了大量数据,地图可能会因为碰撞而变慢。

一种常见的方法是稍后进行优化,以防需要优化。

【讨论】:

【参考方案2】:

您尝试过Oracle 在Java SDK 中提供的“jps”工具吗?您可以在 JavaSDK/bin 文件夹中找到它。它是性能检查甚至内存使用的绝佳工具。

【讨论】:

哎呀......有点误会。它不是“jps”而是“jvisualvm”。

以上是关于如何测量数据结构的内存使用情况? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在负载测试期间测量 CPU 和内存

如何测量 32 位程序中 64 位进程的内存使用情况?

如何从 C++ 程序内部测量内存使用情况?

通过同时运行两个可执行文件来测量内存使用情况

如何测量 F# 代码的 CPU 和内存使用情况?

如何测量 C 中的函数堆栈使用情况?