gpt4 book ai didi

c# - 一段时间后 GC 包含大量固定对象

转载 作者:太空狗 更新时间:2023-10-30 00:47:33 26 4
gpt4 key购买 nike

我在不断实例化一个com-wrapper然后让GC收集它(不是强制的)时有一个奇怪的现象。

我正在 WinCE x86 上的 .net cf 上对此进行测试。使用 .net Compact 框架远程监视器监视性能。使用平台构建器工具包中的 Windows CE 远程性能监视器跟踪 native 内存。

在前 1000 个创建的实例中,perfmon 中的每个计数器似乎都正常:

  • GC 堆上下波动,但平均值保持不变
  • 固定对象为 0
  • native 内存保持相同的平均值
  • ...

但是,在这 1000 个(大约)之后,固定对象计数器会上升并且永远不会再下降。然而,内存使用量保持不变。

我不知道从这些信息中得出什么结论...这是计数器中的错误,这是我的软件中的错误吗?

[编辑]

我确实注意到,一旦 GC 稳定后使用的总字节数,固定对象计数器就开始上升,压缩器计数器未移动的对象也是如此。

The graphic of the counters http://files.stormenet.be/gc_pinnedobj.jpg

[/编辑]

相关代码如下:

    private void pButton6_Click(object sender, EventArgs e) {
if (_running) {
_running = false;
return;
}
_loopcount = 0;
_running = true;

Thread d = new Thread(new ThreadStart(LoopRun));
d.Start();
}

private void LoopRun() {
while (_running) {
CreateInstances();
_loopcount++;
RefreshLabel();
}
}

void CreateInstances() {
List<Ppb.Drawing.Image> list = new List<Ppb.Drawing.Image>();
for (int i = 0; i < 10; i++) {
Ppb.Drawing.Image g = resourcesObj.someBitmap;
list.Add(g);
}

}

Image 对象包含一个 AlphaImage:

    public sealed class AlphaImage : IDisposable {
IImage _image;
Size _size;
IntPtr _bufferPtr;

public static AlphaImage CreateFromBuffer(byte[] buffer, long size) {
AlphaImage instance = new AlphaImage();
IImage img;
instance._bufferPtr = Marshal.AllocHGlobal((int)size);
Marshal.Copy(buffer, 0, instance._bufferPtr, (int)size);
GetIImagingFactory().CreateImageFromBuffer(instance._bufferPtr, (uint)size, BufferDisposalFlag.BufferDisposalFlagGlobalFree, out img);
instance.SetImage(img);
return instance;
}

void SetImage(IImage image) {
_image = image;
ImageInfo imgInfo;
_image.GetImageInfo(out imgInfo);
_size = new Size((int)imgInfo.Width, (int)imgInfo.Height);
}

~AlphaImage() {
Dispose();
}

#region IDisposable Members

public void Dispose() {
Marshal.FinalReleaseComObject(_image);
}
}

最佳答案

好吧,您的代码中存在一个错误,您正在创建大量 IDisposable 实例并且从不对它们调用 Dispose。我希望最终确定器最终会启动,但它们实际上不是必需的。在您的生产代码中,您是否适本地处理了所有内容 - 如果没有,是否有一些原因导致您不能?

如果您在 AlphaImage 终结器中放置一些日志记录(检测 AppDomain 卸载和应用程序关闭并且在这些情况下不记录!)它是否显示正在调用终结器?

编辑:一个可能不会困扰您的潜在问题,但无论如何都值得修复 - 如果对 CreateImageFromBuffer 的调用因任何原因失败,您仍然拥有 AllocHGlobal 创建的内存,并且目前将被泄露。我怀疑这不是问题所在,否则它会爆发得更壮观,但值得考虑。

关于c# - 一段时间后 GC 包含大量固定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/374215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com