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