在不断实例化一个 com-wrapper 然后让 GC 收集它(不是强制)时,我有一个奇怪的现象。
我正在 WinCE x86 上的 .net cf 上对此进行测试。使用 .net Compact 框架远程监控器监控性能。使用平台构建器工具包中的 Windows CE 远程性能监视器跟踪本机内存。
在前 1000 个创建的实例中, perfmon 中的每个计数器似乎都正常:
- GC 堆上升和下降,但平均值保持不变
- 固定对象为 0
- 本机内存保持相同的平均值
- ...
但是,在这 1000 个(大约)之后,固定对象计数器会上升,并且永远不会再下降。但是,内存使用量保持不变。
我不知道从这些信息中得出什么结论...这是计数器中的错误,这是我的软件中的错误吗?
[编辑]
我确实注意到,一旦 GC 稳定后使用的总字节数与压缩器计数器未移动的对象一样,固定对象计数器开始上升。
计数器图形 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);
}
}