您在使用.net程序时使用了哪些分析器,您会特别推荐哪些?
为什么这样:
class OutOfMemoryTest02
{
static void Main()
{
string value = new string('a', int.MaxValue);
}
}
Run Code Online (Sandbox Code Playgroud)
抛出异常; 但这不会:
class OutOfMemoryTest
{
private static void Main()
{
Int64 i = 0;
ArrayList l = new ArrayList();
while (true)
{
l.Add(new String('c', 1024));
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我们有一个.NET应用程序,我们的客户认为它太大而无法进行大规模部署,我们希望了解是什么有助于我们的内存占用,并且可以在不完全放弃.NET和wpf的情况下做得更好.
我们有兴趣改进总大小和私人工作集(pws).在这个问题中我只想看看pws.VMMap通常会报告105 MB的pws.其中11mb是图像,31mb是堆,52mb是托管堆,7mb是私有数据,其余是堆栈,页表等.
这里最大的奖项是托管堆.我们可以直接在我们自己的代码中占用大约8mb的manged堆,即我们创建和管理的对象和窗口.其余的是由我们使用的框架元素创建的可能的.NET对象.
我们想要做的是确定框架帐户的哪个元素占这个用途的哪个部分,并且可能重新构建我们的系统以避免在可能的情况下使用它们.任何人都可以建议如何进行这项调查?
进一步澄清:
到目前为止,我已经使用了许多工具,包括优秀的ANTS分析器和带有SOS的WinDbg,它们允许我看到托管堆中的对象,但真正感兴趣的不是"什么?",而是"为什么? " 理想情况下,我希望能够说,"好吧,因为我们使用WCF,所以在这里创建了10mb的对象.如果我们编写自己的本地传输,我们可以节省8mb的x质量风险和开发工作."
不可能在300,000多个对象上执行gcroot.
我正在开发一个文件上传经常发生的应用程序,并且可能非常大.
这些文件正在上传到Web API,然后Web API将从请求中获取流,并将其传递给我的存储服务,然后将其上载到Azure Blob存储.
我需要确保:
我看过这篇文章,它描述了如何禁用输入流缓冲,但是许多不同用户的文件上传同时发生,重要的是它实际上完成了它在锡上所说的内容.
这就是我目前控制器中的内容:
if (this.Request.Content.IsMimeMultipartContent())
{
var provider = new MultipartMemoryStreamProvider();
await this.Request.Content.ReadAsMultipartAsync(provider);
var fileContent = provider.Contents.SingleOrDefault();
if (fileContent == null)
{
throw new ArgumentException("No filename.");
}
var fileName = fileContent.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
// I need to make sure this stream is ready to be processed by
// the Azure client lib, but not buffered fully, to prevent OoM.
var stream = await fileContent.ReadAsStreamAsync();
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何可靠地测试这个.
编辑:我忘了提到直接上传到Blob存储(绕过我的API)将无法正常工作,因为我正在进行一些大小检查(例如,这个用户可以上传500mb吗?这个用户是否使用了他的配额?).
我创建了一个带有2个Dialogs的示例程序.两个对话框都有一个图片框,一个调用pictureBox1.Image.Dispose(); 在受保护的覆盖void Dispose(bool disposing)方法中,另一方法没有.
当您运行该程序并使用任务管理器查看内存使用情况时,很明显,该对话框不会调用pictureBox1.Image.Dispose(); 泄密记忆非常糟糕.
是否有人建议使用能够以如此清晰的方式显示问题的工具?
有没有办法计算特定c#源文件的内存分配/释放?至少这是我能够用非托管C++做的事情.
我使用PerfView调整应用程序,第二个最昂贵的项目目前标记为:
其他<< clr!JIT_New >>
占CPU的10%以上.即使对于后续运行的测试用例,这仍然存在.
任何人都可以确定哪些活动或代码实践可能导致动态生成需要JIT-ting的新代码?
我正在用C#编写一种游戏,我想知道什么是更好的内存使用方法。现在我有了它,因此它经历了一个while循环,并且在游戏运行时它将检查某些事情(此人已死等),睡一秒钟,然后重试。游戏结束后,将while设置为false并退出该方法。计时器会是更好的方法吗?有时在运行此游戏时会注意到内存问题。
我正在尝试减少我拥有的控制台应用程序的内存使用量。它应该连续运行几个小时,但似乎内存使用量每秒都在逐渐增加。它确实使用多个线程,并执行各种操作,但我在某处读到,大量调用 Console.WriteLine 也会导致内存峰值。
因为应用程序不断地写入控制台,我想内存使用可能就是因为这个。不幸的是,我无法轻松清除控制台,因为我将输出重定向到监视窗口。我暂时关闭了它,但内存仍在增加,这告诉我还有其他事情需要解决。
在我开始寻找内存泄漏之前,我想知道是否有人可以确认/验证拥有数千个 Console.WriteLine 是否会导致内存泄漏,或者重定向的输出缓冲区是否已经正确处理了内存泄漏。我尝试进行搜索,但没有找到太多相关信息。
我似乎遇到了一些大的内存消耗问题。当我第一次加载包含 gridview 和 observablecollection 的 wpf 应用程序时,该应用程序大约为 10mb。
当我单击 gridview 中的一个项目时,它会打开另一个窗口,其中包含一个图像控件,该控件传递一个 base64 字符串,然后我将其转换为 BitmapImage
然后应用程序从 10mb 跳到大约 123mb。原始图像大小为 64k,但我所有存储的图像都是 base64 字符串,我将其转换回 byte[] 然后转换为 BitmapImage。是的,我的意思是这样做。
当我关闭窗口时,没有一个 ram 被释放。我什至尝试过调用 GC。
我使用下面的代码将base64图像变成
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.StreamSource = new SIO.MemoryStream(imageBytes);
bitmapImage.EndInit();
return bitmapImage;
Run Code Online (Sandbox Code Playgroud)
然后被分配给 Image.Source
我想知道在调试时是否可以知道使用Visual Studio 2013加载了多少个类型的对象.我目前正在使用C#进行开发.
我正在寻找一种方法来增加.NET应用程序的启动时间.
想法是在启动初始化后立即进行进程内存转储并将其存储在磁盘上.在第二次运行时,用转储和加速应用程序启动替换进程内存会很不错.
所以,我的问题:
谢谢.
我在visual studio 2010下有一个Windows应用程序c#
我创建具有名称的类book与3个字段(name,writingDate,author)
我创建另一个名为()book列表的类bookList<book>
当我检索books类数据时,我需要知道它的字节大小
我怎样才能做到这一点?
注意:我尝试Marshal.SizeOf(books)但发生此错误
"Type 'System.Collections.Generic.List`1[books]' cannot be marshaled as
an unmanaged structure; no meaningful size or offset can be computed."
Run Code Online (Sandbox Code Playgroud)
任何帮助?
c# ×10
.net ×7
memory-leaks ×2
performance ×2
profiling ×2
asp.net ×1
azure ×1
byte ×1
clr ×1
console ×1
heap ×1
list ×1
managed ×1
memory ×1
optimization ×1
perfview ×1
profiler ×1
thread-sleep ×1
timer ×1
unsafe ×1
while-loop ×1
wpf ×1