我在Spring4d容器中注册了许多对象,有些是因为Singleton.When应用程序关闭--几乎是单个对象正确调用自己的破坏--但也有一些对象和FastMM报告内存泄漏。我在寻找一种方法,如何记录哪些对象有问题。我尝试使用这个简单的例子来体验容器扩展:
unit Spring.Container.HCV.Extension;
interface
uses
Spring.Container.Extensions, Spring.Container.Core, Spring.Container.Builder;
type
THCVLoggerBuilderInspector = class(TInspectorBase)
protected
procedure DoProcessModel(const kernel: IKernel; const model: TComponentModel); override;
end;
TFakeBuilderInspector = class(TInspectorBase)
protected
procedure DoProcessModel(const kernel: IKernel; const model: TComponentModel);
override;
end;
THCVLoggerExtension = class(TContainerExtension)
protected
procedure Initialize; override;
end;
implementation
uses
Spring.Container.Common;
procedure THCVLoggerBuilderInspector.DoProcessModel(const kernel: IKernel;
const model: TComponentModel);
var
lLT:string;
begin
if model.ComponentType.IsInstance then
begin
case model.LifetimeType of
TLifetimeType.Unknown: lLT:='Unknown ';
TLifetimeType.Singleton: lLT:='Singleton ';
TLifetimeType.Transient: lLT:='Transient ';
TLifetimeType.PerResolve: lLT:='PerResolve ';
TLifetimeType.SingletonPerThread: lLT:='SingletonPerThread';
TLifetimeType.Pooled: lLT:='Pooled ';
TLifetimeType.Custom: lLT:='Custom ';
else
end;
kernel.Logger.Info('Builder: [%s] %s',[lLT,model.ComponentTypeName]);
end;
end;
procedure THCVLoggerExtension.Initialize;
begin
Kernel.Builder.AddInspector(THCVLoggerBuilderInspector.Create);
Kernel.Builder.AddInspector(TFakeBuilderInspector.Create);
end;
procedure TFakeBuilderInspector.DoProcessModel(const kernel: IKernel; const
model: TComponentModel);
begin
kernel.Logger.Info('FakeBuilderInspector');
end;
end.在注册方面我有
container.AddExtension<THCVLoggerExtension>;容器正确调用THCVLoggerExtension.Initialize,但在我的检查人员中从未被称为DoProcessModel.Why?
发布于 2022-07-28 16:03:20
可能是因为在容器上调用Build之后添加了扩展吗?另一个原因可能是没有看到任何日志记录--您是否在DoProcessModel中放置了一个断点来验证它没有被调用?
对于实际的问题:使用单例的内存泄漏几乎总是由于容器没有计算出正确的重新计算这些类的结果。在注册任何未从TRefCounting继承的类时,将正确的AsSingleton值传递给TInterfacedObject。
https://stackoverflow.com/questions/73152477
复制相似问题