[更新 - 2010年9月30日]
由于我对这个及相关主题进行了很多研究,我会写出我从我的经验和建议中收集的任何提示,这些提示在这里给出了答案 -
1)使用内存分析器(尝试CLR Profiler,开始)并找到消耗max mem并对其进行微调的例程,如重用大数组,尝试将对象的引用保持在最小.
2)如果可能,分配小对象(对于.NET 2.0小于85k)并使用内存池,如果可以避免垃圾收集器的高CPU使用率.
3)如果增加对象的引用,则负责将它们取消引用相同的次数.你会安心,代码可能会更好.
4)如果没有任何作用且您仍然无能为力,请使用消除方法(注释/跳过代码)来找出消耗最多内存的内容.
在代码中使用内存性能计数器也可能对您有所帮助.
希望这些帮助!
[原始问题]
嗨!
我在C#工作,我的问题是内存不足异常.
我在这里读了一篇关于LOH的优秀文章 - > http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/
太棒了!
并且, http://dotnetdebug.net/2005/06/30/perfmon-your-debugging-buddy/
我的问题:
我在企业级桌面应用程序中遇到内存不足问题.我试着阅读并理解有关内存分析和性能计数器的内容(尝试过WinDBG! - 一点点)但我仍然对基本内容毫无头绪.
我尝试使用CLR分析器来分析内存使用情况.它有助于:
告诉我谁分配了大量的内存
什么数据类型使用最大内存
但是,CLR Profiler和性能计数器(因为它们共享相同的数据)都无法解释:
每次运行应用程序后收集的数字 - 如何理解是否有任何改进?!?!
如何比较每次运行后的性能数据 - 特定计数器的优先级是低还是高?
我需要的:
我正在寻找以下提示:
如何释放(是,正确)托管数据类型对象(如数组,大字符串) - 但如果可能的话,不要通过进行GC.Collect调用.我必须时不时地处理长度为500KB(不可避免的大小:-()的字节数组.
如果发生碎片,如何压缩内存 - 因为看起来.NET GC并没有真正有效地做到这一点并导致OOM.
另外,LOH究竟有85KB的限制?这是数组整体大小的对象大小吗?这对我来说不是很清楚.
哪些内存计数器可以判断代码更改是否实际上减少了OOM的可能性?
提示我已经知道了
将托管对象设置为null - 将它们标记为垃圾 - 以便垃圾收集器可以收集它们.这很奇怪 - 在将string []对象设置为null之后,所有Heaps中的#个字节都会出现!
避免创建> 85KB的对象/数组 - 这不在我的控制范围内.所以,可能会有很多LOH.
3.
Memory Leaks Indicators: # bytes in all Heaps …
我对列表框中自定义datatemplate的布局感到困惑.问题是每个ListBoxItem都不占用整行宽度.
这是ListBox的DataTemplate:
<Window x:Class="NewPropertyGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:NewPropertyGrid"
Title="MainWindow" Height="200" Width="300">
<Window.Resources>
<DataTemplate x:Key="PropertyListTemplate">
<Grid Background="Yellow">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=PropType,Converter={local:PropTypeToString}}"
Margin="1"
VerticalAlignment="Center"
Background="LightGray"
Foreground="Black"
/>
<TextBlock Grid.Column="1"
Text="="
Margin="1"
Background="LightGray"
Foreground="Black"
/>
<ContentControl Grid.Column = "2"
Content = "{Binding Editor}"
HorizontalAlignment = "Stretch"
VerticalAlignment = "{Binding VerticalContentAlignment}"
/>
</Grid>
</DataTemplate>
</Window.Resources>
<ListBox x:Name="lv" ItemTemplate="{StaticResource PropertyListTemplate}" Background="Green" />
</Window>
Run Code Online (Sandbox Code Playgroud)
如您所见,Grid中有3列.第三个应该是Editor(FrameworkElement),通过后面的代码决定.以下是作为信息源的类数据结构:
namespace NewPropertyGrid {
public enum PropType { Name, Age, Surname };
public class …Run Code Online (Sandbox Code Playgroud)