小编Nay*_*yan的帖子

了解内存性能计数器

[更新 - 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.ne​​t/2005/06/30/perfmon-your-debugging-buddy/

我的问题:

我在企业级桌面应用程序中遇到内存不足问题.我试着阅读并理解有关内存分析和性能计数器的内容(尝试过WinDBG! - 一点点)但我仍然对基本内容毫无头绪.

我尝试使用CLR分析器来分析内存使用情况.它有助于:

  1. 告诉我谁分配了大量的内存

  2. 什么数据类型使用最大内存

但是,CLR Profiler和性能计数器(因为它们共享相同的数据)都无法解释:

  1. 每次运行应用程序后收集的数字 - 如何理解是否有任何改进?!?!

  2. 如何比较每次运行后的性能数据 - 特定计数器的优先级是低还是高?


我需要的:

我正在寻找以下提示:

  1. 如何释放(是,正确)托管数据类型对象(如数组,大字符串) - 但如果可能的话,不要通过进行GC.Collect调用.我必须时不时地处理长度为500KB(不可避免的大小:-()的字节数组.

  2. 如果发生碎片,如何压缩内存 - 因为看起来.NET GC并没有真正有效地做到这一点并导致OOM.

  3. 另外,LOH究竟有85KB的限制?这是数组整体大小的对象大小吗?这对我来说不是很清楚.

  4. 哪些内存计数器可以判断代码更改是否实际上减少了OOM的可能性?

提示我已经知道了

  1. 将托管对象设置为null - 将它们标记为垃圾 - 以便垃圾收集器可以收集它们.这很奇怪 - 在将string []对象设置为null之后,所有Heaps中#个字节都会出现!

  2. 避免创建> 85KB的对象/数组 - 这不在我的控制范围内.所以,可能会有很多LOH.

3.

Memory Leaks Indicators:

# bytes in all Heaps …

c# performance performancecounter

5
推荐指数
1
解决办法
4587
查看次数

自定义DataTemplate - Control不占用整个网格列宽

我对列表框中自定义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)

c# wpf datatemplate

1
推荐指数
1
解决办法
486
查看次数

标签 统计

c# ×2

datatemplate ×1

performance ×1

performancecounter ×1

wpf ×1