我进行分析时内存的奇怪行为

Posted

技术标签:

【中文标题】我进行分析时内存的奇怪行为【英文标题】:Strange behavior of memory when i make profiling 【发布时间】:2012-12-07 10:24:54 【问题描述】:

我在进行分析时遇到了一个奇怪的问题。我解释说,在下图中,我们可以清楚地看到最大的对象只取35mo。看这个图: .但是当我验证同时使用的内存时,我注意到它超过了500mo

有人可以解释一下为什么最大的对象占用最大35mo,而使用的堆同时超过500?以及如何计算heap used

【问题讨论】:

【参考方案1】:

您可能没有对所有对象创建进行概要分析。 Netbeans 中的标准配置文件设置之一仅配置 10 个对象创建中的 1 个。您的测量结果表明 35MB 是您数据的 51%。因此,您总共分析了 70MB。这大约是您测量的总堆大小的 1/10。

一般来说,如果您正在寻找有关谁是最大的记忆消耗者的线索,那么只测量部分创作就足够了。不跟踪所有创作的原因是性能。

如果您想查看所有内存的使用情况,可以执行以下操作:

在 Netbeans 6.9.1 中,这是一个设置为“跟踪每个 ... 对象分配”。您可以降低这个数字(如果十分之一不能帮助您找到问题,也不能告诉您有关应用程序的足够信息)。但是,这可能会导致您的应用程序无法运行。

您还可以进行堆转储。这将不包含有关创建和删除对象的信息,但它会告诉您应用程序中当前处于活动状态的 所有 对象。

【讨论】:

感谢您的回复。我使用 netbeans 7.0.1 和我 Track every 10 object allocations。我可以根据图 1 [Live object, avg life, Generation ...] 给出的特征计算heap used 吗? 你可以近似它(就像我在答案中所做的那样)。但是,除非您对所有内容进行分析,否则您无法得到明确的答案。但是,当您进行堆转储时,您将得到准确的答案。

以上是关于我进行分析时内存的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Spark:MEMORY_ONLY_SER_2 - 奇怪的内存行为

在 SSE 中进行比较时的奇怪行为

对 JMS 队列上的消息进行计数时的奇怪行为

使用 Twitch 进行身份验证时的 Spring-Boot OAuth2 奇怪行为

Tomcat 8 (jvisualvm) 下的奇怪内存行为

在使用 Android 2.2 的 HTC Desire 上使用 Android MediaPlayer 进行流式传输时的奇怪行为