带有自动内存清理功能的图像下载器
我有一个带有图像的项目列表(简单的列表框)(如果用户单击列表项目,则打开详细信息页面).我面临着图像记忆泄漏时面临着非常著名的问题,描述了在这里, a href =" https://stackoverflow.com/questions/13816569/windows-phone-listbox-with-images-with-images-un-memory?lq = 1">在这里//stackoverflow.com/questions/7062820/clear-cache-in-window-phone-phone-7"> here 和在这里. 一种可能的方法是通过所有图像运行从 nakigating in 线程之一,我找到了更多有趣的解决方案:它自动清洁图像,但这无助于虚拟化(如果添加私有字段来存储imagesource).建议的修复是添加依赖性属性. ,但我仍然面临着同样的问题:向下滚动并返回后,图像混合在一起.看起来像依赖性属性是随机更改的,但我无法抓住它
0 2024-04-16
编程技术问答社区
我应该使用静态方法还是非静态方法?
我已经在C#中创建了一个控制台应用程序,并且有 main 方法(静态),我的要求分别初始化了2个计时器和处理2种方法,该方法将定期调用以执行某些任务.现在,我采用了所有其他方法/变量静态的,因为它是从计时器处理程序事件调用的(由于从main调用它是静态的). 现在,我想知道,如果该控制台运行长时间,则如何消耗内存?如果我想应用OOPS概念,那么我是否需要使所有方法/变量不静态,并通过创建类的对象来访问它?在这种情况下,记忆将如何消耗? 更新: 以下是我的代码的片段 public class Program { readonly static Timer timer = new Timer(); static DateTime currentDateTime; //other static variables //----- static void Main() {
0 2024-04-16
编程技术问答社区
在C#中,是否有可能在不创建新数组的情况下将一个字节数组投到另一个类型?
我有一个字节[]对象,我用作数据缓冲区. 我想将其"读"为原始/非启示结构的数组,而不复制内存中的字节[]数据. 目标将是: byte[] myBuffer; //Buffer is populated int[] asInts = PixieDust_ToInt(myBuffer); MyStruct[] asMyStructs = PixieDust_ToMyStruct(myBuffer); 这可能吗?如果是这样,如何? 解决方案 有可能吗?实际上,是! 自.NET CORE 2.1,MemoryMarshal以来,让我们可以为跨度执行此操作.如果您对跨度而不是数组感到满意,则是. var intSpan = MemoryMarshal.Cast(myByteArray.AsSpan()); int跨度将包含bytecount/4整数. 至于自定义结构...该文档声称在转换两侧需要"原始类型".但是,您可
0 2024-04-16
编程技术问答社区
何时(不)有相同内容的两个字符串共享同一内存?
来自问题拥有Java代码 String s1="Java"; 将在同一内存位置(或多个)分配此字符串: 是否要多次启动同一程序并同时执行(同时)? 可能的答案: 我目前是C#开发人员(尽管在上一千年中在Java中进行了编程). 我问了这个问题,因为我相信.NET CLR和JAVA(JVM)之间的情况相同,我希望能找到.NET应用程序的答案(但某种程度上通过经常遇到的"应用程序"池术语对此表示怀疑) . 所以,它似乎是(很抱歉在询问之前不要详尽搜索) CLR/JVM是否为所有运行.NET/JAVA应用程序保留一个单个实习生池? 根据同一JVM或.NET CLR的所有实例/程序共享 String 实习池的答案. 解决方案 @gennady-vanin-novosibirsk .... 字符串s1 =" java"; string s2 =" java"; string s3 =" java"; string s4 =" jav
0 2024-04-16
编程技术问答社区
MonoTouch。应用程序因内存不足而被杀死,为什么?Live bytes allocation 5 MB top
我的iPad应用程序是在Monotouch中开发的,因为我想避免所有的内存管理地狱,但并非如此.在模拟器上,一切都很好,但是当我在设备上测试我的应用程序时,我惊恐地发现它在记忆警告后迅速被操作系统杀死. 我的应用程序是一个简单的图像浏览器,它加载了一些png映像,并在uiscrollview中使用一些Uiviews显示,在获得触摸时加载下一个或上一个.在模拟器上它可以正常工作.但是在装载和卸载约6-11张图像后,它开始收到内存警告,然后突然被杀死.我已经检查了我所有的安装周期,并且在加载新图像之前正确删除了所有参考. 因此,我启动了乐器,并开始分析iPad上应用程序的内存分配.在那里,我发现现场字节仅为5-9 MB,只是我所期望的,但是由于某种奇怪的原因,死者记忆分配几乎根本没有收集,因为在分配了约50 MB之后(少于5-9 MB)它是活字节)它被杀死了!这是我应用程序的仪器分析会话的屏幕截图: 这是堆序: 也有一些小泄漏,但我认为它们还不够大,无法成为罪魁祸首.它们都
0 2024-04-16
编程技术问答社区
获取管理对象在内存中的'乐观'大小
首先,我知道许多发布的问题涵盖了该主题: 1 2 3 4 5 .提出的方法及为什么不: Marshal.sizeof() 1 - 不适用于托管类型. gc.gc.gettotalmemory 1 序列化 1 2 3 4 - 非常接近,但是 自动场可能是有问题的,并且属性没有 公共二传手.另外,这不是最佳性能. 使用SOS 1 由于填充和问题,发布 1 2 3 ,似乎没有最佳解决方案,而是精确之间的权衡. ,性能和代码. 但是,我需要简单的方法来计算乐观(最小)内存使用情况,即我想知道该对象至少占据了 .理由是我有类型的环境拥有许多集合,有时是嵌套的,我想快速近似,一个对象即将接近内存中的.5 GB等. . 有我想出的内容和我的问题: 我期待着您的想法和建议 做得更好. 尤其是,我正在寻找不是 在此代码中说明,并且可以(不编写200行 为此代码). 我无法获得自动生成的字段(属性 __BackingField)对于继承类型,虽然它适用于未继承的备份字
0 2024-04-16
编程技术问答社区
C#: 一个对象的内存使用情况
有没有办法找到特定对象的内存?例如列表.考虑到所有内容,例如字符串Interning以及编译器/运行时环境/其他任何内容. 解决方案 您确实必须定义 您的意思是"特定对象的内存数量".例如,您可能意味着"如果收集了垃圾,将释放多少垃圾" - 或者您可能的意思是"这个对象有多少内存,其触摸的一切都占据了." 您对字符串实习的观点是一个很好的例子.假设您这样做: List internedStrings = new List(); List nonInternedStrings = new List(); for (int i=0; i
0 2024-04-16
编程技术问答社区
一个函数内的局部变量什么时候真正被分配了?
只是对此感到好奇.以下是相同功能的两个代码段: void MyFunc1() { int i = 10; object obj = null; if(something) return; } 另一个是... void MyFunc1() { if(something) return; int i = 10; object obj = null; } 现在,第二个是在某物是真的的吗?或局部堆栈变量(在当前范围内)总是在调用函数后立即分配,并且将返回语句移至顶部没有效果? dotnetperls.com的链接 说"当您称呼C#中的方法程序,即使您不访问函数调用中的变量,运行时都会分配一个单独的内存区域来存储所有本地变量插槽." 更新 这是这两个功能的IL代码的比较. func2指的是第二次.在两种情况下,变量似乎是在开始时分配的,尽管在func2()的情况下,稍后将其初始化.我想没有好处. 解决方案
0 2024-04-15
编程技术问答社区
如何确定我的程序目前占用了多少内存?
与我以前的问题有关: 在处理大量文本时,请防止记忆问题 有没有办法确定我的程序正在占用多少内存空间?我最终处理了大量文本文件,通常将处理的对象存储在内存中.有时候,信息太多了,我会用尽内存.我有一个避免记忆分配问题的解决方案,但是我只想在必要时使用它来避免分页,这最终会在不需要的情况下降低我的性能.有没有办法弄清楚我要占有多少内存,以便我只能在必要时给我的信息打印? 注意:我正在寻找可以在必要时开始分页的解决方案. 解决方案 您可以尝试 GC.GetTotalMemory GC.GetTotalMemory GC.GetTotalMemory : 检索字节数 目前被认为是分配的. A 参数指示是否 方法可以等待一个短间隔 返回之前,允许系统 收集垃圾并完成 对象. 重要的是要注意的是:"检索当前被认为是被认为被分配的字节的数量" .这意味着此方法可能不准确100% - 只要您知道这一点,您应该能够在应用程序执行中的给定点上对虚拟内存利用率进行大概的了解.
0 2024-04-15
编程技术问答社区
使用EmptyWorkingSet的副作用是什么?
我正在使用下面的代码来释放某些运行程序上的内存,因为我自己的程序需要大量的内存资源才能更快地运行. [DllImport("psapi.dll")] public static extern bool EmptyWorkingSet(IntPtr hProcess); public FreeMem(string programName){ EmptyWorkingSet(Process.GetCurrentProcess().Handle); foreach(Process process in Process.GetProcesses(programName)) { try { EmptyWorkingSet(process.Handle); } catch (Exception) {
0 2024-04-15
编程技术问答社区
属性是否会增加实例的内存大小?
这可能是一个愚蠢的问题,但是对象属性每个实例都占有任何内存吗? 我理解时,当您实例化对象时,每个值字段均占据其大小和参考字段类型4个字节4个字节.但是,说您有一个具有1000个属性的对象,可以通过某些其他对象获取数据,这些属性本身是否占据任何内存? 自动属性自然可以做到,因为它只是句法糖,但似乎不应该... 解决方案 属性在这方面就像普通方法一样. 该代码需要存储在某个地方(一次),并且每个使用的字段(自动属性!)需要每个实例存储.本地变量也将占用一些内存. 一些示例: private int myProperty; public int MyProperty { get => myProperty; set => myProperty; } 该属性本身不占用实例存储器,但是myProperty当然会. public int MyProperty { get; set; } 我没有定义任何备份字段,但是编译器为我做到了 - 因此生成的备
0 2024-04-15
编程技术问答社区
C# : Xml.Load(file)的关闭方法
我编写了一些使用XmlDocument对象加载XML文档的代码,以计算其节点.这是方法: XmlDocument xml = new XmlDocument(); xml.Load(textBox1.Text); XmlNodeList nodes = xml.SelectNodes("//File"); foreach (XmlNode node in nodes) { number_of_childs++; } 我面临的问题是,在导入大文件时,它会达到700MB的RAM.如果然后尝试在文件上执行一些操作,或者甚至从中读取以显示其数据,则该应用程序的速度大约为2GB RAM.因此,我想知道,是否有一种方法可以关闭XmlDocument并释放其内存,从而释放RAM.就像它忘记了从内存中删除其内容一样. 解决方案 否. XmlDocument类未实现IDisposable,因此没有办法强迫它随意发布其资源.如果您确实需要立即释放XmlDocument>的内存,那么
0 2024-04-15
编程技术问答社区
在像.NET这样的管理环境中,是否可能出现内存泄漏?
在C ++中,很容易拥有永久内存泄漏 - 只需分配内存即可发布: new char; //permanent memory leak guaranteed 并且该内存保留在堆的寿命中分配(通常与程序运行时持续时间相同). 是相同的(在内存管理机制正常工作时从未发布过特定的未引起的对象的情况)在C#程序中可能? 我已经仔细阅读了这个问题并回答它,并提到某些情况会导致更高的内存消耗量超出预期的或IMO的极端情况,例如僵局终结器线程,但是在C#程序中是否可以使用正常运行的内存管理形成永久泄漏? 解决方案 这取决于您如何定义内存泄漏.在一种不受管理的语言中,我们通常认为内存泄漏是分配内存的情况,并且不存在它的参考,因此我们是无法释放它的情况. 这种泄漏几乎是不可能在.NET中创建的(除非您呼叫到不受管理的代码,否则除非运行时有错误). 但是,您可以得到另一种"弱"形式的泄漏形式:当存在对内存的引用 die 时(因此,仍然可以找到并重置参考,从而允许GC释
0 2024-04-15
编程技术问答社区
我可以在C#中强制清理内存吗?
我听说C#即使您已经完成了,也不会立即免费记忆.我可以强迫C#免费记忆吗? 我正在使用Visual Studio 2008 Express.这有关系吗? P.S.我没有C#的问题以及它如何管理内存.我只是好奇. 解决方案 吉姆, 您听到了正确的声音.它通过称为垃圾收集器的机制定期清理记忆.您可以通过下面的通话来"强制"垃圾收集. GC.Collect(); 我强烈建议您阅读垃圾收集中的这篇MSDN文章. 编辑1:"力"是用引号.更清楚,就像另一张海报一样,这实际上只是暗示了这一点.您实际上不能在特定的时间点实现它.因此 编辑2:我意识到这里的每个人都只为您的主要问题提供了一个直接的答案.至于您的次要问题.使用Visual Studio 2008 Express仍将使用.NET Framework,这就是执行垃圾收集的方法.因此,如果您升级到专业版,您仍然具有相同的内存管理功能/限制. 编辑3: this wikipedia aritcle
0 2024-04-15
编程技术问答社区
在Perf Mon中看到高的 "GC时间百分比 "的原因
在监视我们在Perf Mon中的应用程序时,我注意到GC中的时间百分比在20-60%的范围内,而我们的应用程序执行了长时间的运行过程(在30秒至1.5分钟之间变化).对我来说这似乎有点过分.这提出了两个重要的问题. 我是否纠正了这个过多的? 我如何弄清楚为什么路线会导致GC尖峰? 解决方案 是的,这听起来确实过多.减少GC的数量可能是您减少应用程序运行时间的最佳步骤(如果这是您的目标). 通常是由分配然后扔掉数千个或数百万个对象引起的高" GC中%时间".找出正在发生的事情的一个好方法是使用内存剖面工具. Microsoft提供免费的一个很棒的商业工具是Scitech的 .net内存profiler .这施加了少得多的运行时间开销,并且有免费试用时间.通过在运行过程时拍摄多个快照,您可以发现经常分配哪些类型的对象(然后被销毁). 确定了分配的来源后,您就需要检查代码并弄清楚如何减少这些分配.虽然没有一种适合的答案,但我过去遇到的某些事情包括: st
0 2024-04-15
编程技术问答社区
在C#中的Volatile和Thread.MemoryBarrier
要实现锁定代码用于多线程应用程序,我使用了volatile变量, 理论上:volatile关键字仅用于确保所有线程都看到挥发性变量的最新值;因此,如果thread A更新变量值和thread B读取该变量发生后的变量,将会看到最近从线程A中写入的最新值. 正如我在简而 这是不正确,因为 施加挥发性不能阻止写入,然后读取读数. 可以通过将Thread.MemoryBarrier()放在volatile变量之前解决这个问题,例如: private volatile bool _foo = false; private void A() { //… Thread.MemoryBarrier(); if (_foo) { //do somthing } } private void B() { //… _foo = true; //… } ,如果这解决了问题;认为我们有一个段循环,这些循环取
0 2024-04-15
编程技术问答社区
为什么要调用Dispose()?不会发生内存泄漏吗?
编辑:我的问题没有得到我想要的主要答案.我不清楚.我真的很想知道两件事: 不能调用Dispose()导致内存泄漏? 如果您有一个大程序并且永远不会在任何可iDisposable的对象上调用Dispose(),会发生什么最糟糕的事情? 我的印象是,如果未在IDisposable对象上调用Dispose(),可能会发生内存泄漏. 根据此 thread ,我的感知不正确;如果未调用Dispose(),将不会发生内存泄漏. 为什么要打扰Dispose()呢?是为了立即释放资源,而不是以后释放吗?如果您有一个大程序,并且在任何IDisposable对象上都不会拨打Dispose(),可能会发生什么最糟糕的事情? 解决方案 Dispose用于发布非管理资源.这可能意味着内存,如果一类分配了非管理的内存,但是它更常见的是本机对象和资源(例如开放文件和数据库连接). 您经常需要在一个本身没有任何非管理资源的课程上拨打处置,但是它确实包含另一个可以支配且可能具有非管
0 2024-04-15
编程技术问答社区
c#结构/类的堆栈/堆栈控制?
因此,在C ++中非常容易.您希望将任何类别/结构的任何分配在堆上分配,请使用新的.如果您在堆栈上需要它,请不要使用新的. 在c#中,我们始终使用新关键字,取决于它是结构还是类,它是在堆栈上分配的还是在堆上分配的(structs to the stack to stack,classess the Heap)以及在某些应用程序中在更改设计时,可以是巨大的性能差异,使得只有这些对象进入真正属于那里的堆. 我想知道的是 - 是否有直接的方法来控制对象在何处分配为结构还是级别?我知道可以将价值类型(结构)装箱到堆中(但拳击/拆箱以性能成本提供).有没有办法在堆栈上分配类? 另外,是否有任何机制可以分配原始内存并使用C ++中的新位置?我知道这会随着管理的想法而破裂 - 但是,如果您可以使用自定义内存管理,则可以产生很大的差异. 我爱C#,因为它是垃圾收集器和其他东西 - 但是有时候,当从事瓶装瓶颈时,希望对实际发生的事情有更多的控制. 任何提示/提示欢迎:)
0 2024-04-15
编程技术问答社区
list.count是通过物理迭代来计算,还是保留一个指针来计算?
我正在浏览大量的对象,以做一些有关列表中所述对象的事情. 在迭代期间,我将根据某些条件从列表中删除一些对象. 全部完成后,我需要更新列表中对象数量的UI. (t). 问题: 当我调用list.count时,.net实际上迭代列表中的 计算它,或将计数存储为属性/变量? 如果.NET在列表中进行物理重新介绍,那么我不妨通过列表保存我自己的反面,并保存开销? 谢谢 解决方案 它只是保留内部int即可跟踪项目数.所以没有迭代. 文档显示检索计数是O(1)操作: http://msdn.microsoft. com/en-us/library/27b47ht3%28V = vs.110%29.aspx 您可以自己看到: System/collections/enseric/list.cs 其他解决方案 List被实现为数组列表,并跟踪其自身的大小,因此调用.Count属性不需要任何迭代. 如果您调用Linq .Count
0 2024-04-15
编程技术问答社区