问题标签 [dotmemory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
100 浏览

nlog - NLog:ObjectReflectionCache 类总是初始化一个大容量的 MruCache 对象

我开发了一个使用 NLog 的 WPF 应用程序。

当我使用dotMemory对其进行分析时,我可以看到 NLogs 在配置期间创建的字典使用了大约 300k 的内存。

我不知道 ObjectReflectionCache 和 MruCache 的用途是什么,它们的内存是否会在某个时候被释放。也许有人可以澄清类的目的以及字典使用的巨大容量。

谢谢你。

stacktrace NLog 如何创建 Dictionary

Dictionary 的内存使用情况

NLog 版本:4.7.2

平台:.NET 框架 4.6.1

当前的 NLog 配置

0 投票
2 回答
635 浏览

c# - 需要帮助分析 ASP.Net Core 3.1 内存转储

我准备为此付费!

我的 ASP.Net Core 3.1 应用程序从大约 450MB 开始,逐渐运行到大约 4.5GB(我怀疑如果有更多可用内存它会增长得更多)。

我已经在各个阶段进行了内存转储,并使用dotMemory分析它们似乎表明 JsonSerialiserOptions 是主要嫌疑人:

最大保留尺寸

钻取JsonSerializerOptions显示 3 个实例。两个的数字可以忽略不计,如果我进一步深入研究内存使用率最高的三个中的一个,它的 Key Retention Path 显示如下: 密钥保留路径

这就是我需要帮助的地方。我真的不知道如何处理这些保留路径。我期待如果问题出在我的代码中,我应该在保留路径的底部找到我的应用程序的某个类?我需要帮助试图从这些保留路径中找出问题可能在我的代码中的位置。

0 投票
1 回答
159 浏览

c# - 运行 DotMemory 时应用程序启动异常

我是使用内存泄漏分析器的初学者。我想运行 dotMemory 分析器,但是当我选择:“运行启动项目内存分析”项时,我在命令提示符窗口中看到此异常,并且 jetbrains 窗口显示分析会话已完成!我该如何解决这个问题。请帮我正确运行它...

0 投票
1 回答
231 浏览

linq - EF Core Complex 查询为每个参数变体缓存

我有一个复杂的查询,似乎会导致我的应用程序内存出现内存泄漏。

据我了解,查询结果被缓存,因此每次执行查询时都不需要进行此处理。https://docs.microsoft.com/en-us/ef/core/querying/how-query-works

但看起来查询正在为每个登录系统的用户缓存。从内存转储看来,我们为同一个查询有数千个已编译的查询缓存对象。

在这里输入代码 在此处输入图像描述

查询如下所示。

0 投票
1 回答
69 浏览

java - 为什么从 JetBrains dotMemory 拍摄快照时总内存会变高

我只是想从 JetBrains dotMemory 应用程序中拍摄快照,我注意到当我们拍摄快照时,总内存似乎在增加一点点。那么有人能知道这是什么原因吗?

在拍摄快照之前:
在此处输入图像描述

拍摄快照后:
在此处输入图像描述

如果你们可以看看这两个图像,非托管内存有相当大的内存变化。

0 投票
1 回答
70 浏览

c# - 您尝试打开的工作区与当前的 dotMemory 版本不兼容

我创建了一个带有 .Net 5 目标框架和一个测试类的新 XUnit 测试项目

安装的 NuGet 包是 JetBrains.DotMemoryUnit 3.1.20200127.214830

运行测试后(在 dotMemory Unit 下运行),将创建以下输出

当我单击带有 .dmw 文件的链接时,dotmemory 应用程序已打开

当前应用程序版本和许可信息

并出现对话窗口

如果我选择是,则会打开 dotMemory 2019.1.3,并显示有关许可证信息的对话框已结束(我的许可证仅适用于 2020.3)

那么为什么 dotMemory 2020.3.3 不支持 .dmw 文件呢?

0 投票
1 回答
168 浏览

powershell - dotMemory 命令行计划快照

我正在针对 IoT Windows Forms 应用程序运行 dotMemory 命令行,该应用程序需要在自定义设备上进行数小时的测试。

我的目的是在应用程序在设备上运行时按时间获取内存快照。例如,如果测试设计为 24 小时运行,我想每小时获取 10 秒的内存快照。

我找到了两种方法:

  1. 运行 dotMemory.exe 并按时间获取独立快照,通过使用schtasks来安排每次执行;
  2. attach使用and参数运行 dotMemorytrigger并获取单个文件中的所有快照。

第一个场景已经为我准备好了,但很容易看出,第二个场景在收集数据后更适合进一步分析。

我可以使用如下命令启动它:

C:\dotMemory\dotMemory.exe attach $processId --trigger-on-activation --trigger-timer=10s --trigger-max-snapshots=24 --trigger-delay=3600s --save-to-dir=c:\dotMemory\Snapshots

我的问题来了:

  • 如何在没有任何人工干预的情况下使命令/进程在达到最大快照值后停止?

参考:https ://www.jetbrains.com/help/dotmemory/Working_with_dotMemory_Command-Line_Profiler.html

0 投票
0 回答
187 浏览

xunit - 如何使用 dotMemory Unit 编写测试来检查代码中的零分配?

我只是想用 Rider、Xunit 和 dotMemory Unit 做这样的事情(但应该与 NUnit 或 Visual Studio 类似):

显然,我正在使用i++更复杂的东西来代替我真正想测试的东西,但我想通过它。

我看到的是,由于在 dotMemory 中设置了一个检查点而发生了很多分配,并且所有这些都出现了。我想我可以通过使用查询来排除特定于 JetBrains 命名空间的那些,Where这有点帮助。但是,大部分分配的字节位于 mscorlib 的 System 命名空间中,如果它们是由我的代码创建的,我不想排除它们。

我正在尝试测试以创建无分配/无垃圾代码,所以我真的很想跟踪分配并断言我的代码没有做任何事情。

我还尝试过尝试在 dotMemory.Check() 调用中处理闭包分配并将其移动以使其预先初始化并没有太大帮助。

我的最新版本变得更加混乱,实际上看起来更接近答案:

System 中仍有大量分配由 dotMemory 本身完成。

0 投票
0 回答
37 浏览

.net - 在 dotnet 内存转储中有效地找到数千个对象的根?

所以我有一个 18gb 内存转储,来自 linux 上运行的 dotnet 5 程序。我需要找到成千上万个对象的根源。现在我正在使用 lldb,但大约需要 20 分钟才能找到一个对象的根。是否有任何工具或流程可以快速有效地做到这一点?

0 投票
1 回答
109 浏览

.net - 使用supervisord在后台运行时如何将Ctrl-C发送到dotMemory命令行CLI?

我有多个使用 supervisord 在 Ubuntu 后台运行的 .NET Core 程序(见下文)。该 supervisord.conf 位于 Hello-World 文件夹中。

在每个 supervisord.conf 中,我使用: dotMemory.sh start-net-core --trigger-delay=1m --trigger-timer=00:00:10 ./HelloWorld.dll

当 supervisord 在后台运行 .NET Core 程序时,我可以看到 dotMemory 打印消息说“Press Ctrl+C to end the profiling”

这些 .NET Core 程序捆绑在一个 Dorker 容器中,该容器运行/usr/bin/supervisord -c /all-hello-worlds/supervisord.conf

这是另一个名为 supervisord.confsupervisord.conf的文件,位于all-hello-worlds文件夹中

您可以在 Ubuntu 中可视化文件夹结构,如下所示:

现在我很难将 Ctrl-C 命令发送到 supervisord Hello-World 进程。如果我使用supervisorctl stop Hello-World-1dotMemory 无法正确保存 DMW 文件,我需要使用dotMemory recover方法获取 DMW 文件(这很麻烦)

如果我使用kill -SIGINT [dotMemory process ID],supervisord 会重新启动进程并且不会正确保存 DMW 文件。

无论如何,是否可以将 Ctrl-C 命令发送到使用 supervisord 在后台运行的 dotMemory?我在这里附加了 2 个 supervisord.conf 文件。

如果您需要我提供更多信息,请告诉我。谢谢。