安装程序
.NET为段中的每一代堆(0,1,2,LOH)分配内存,以便在启动时以及在集合之后尝试满足分配请求时获得连续的内存块.
为应用程序"预热"时,为每个堆分配的内存可能会趋于平稳,除了可能用于第2代和大对象堆.在垃圾收集期间,每个堆(0,1,2)都被扫描并压缩,除了大扫描的大对象堆(LOH).
我理解集合的"扫描"部分意味着GC识别哪些对象不再有根并且可用于收集(或完成),并且'compact'意味着堆中仍然存活的地址被重新组织,因此可用的剩余堆具有更多可用的连续内存.
由于超出了堆中每个段的预算,.NET将分配另一个段以便在可能的情况下完成分配.
问题
我的问题归结为每个堆中的内存会发生什么,应用程序(已提交)不再使用,但仍由.NET保留? 什么时候发布回操作系统?.
我认为这是一个过程可能会占用大量内存的场景(虚拟大小非常大,但私有字节很小),但是当检查它的堆大多是可用空间时.作为另一个警告,堆的总大小也可能非常小,并且不考虑该过程消耗的内存.
没有阻止的终结器,并且对于一个进程看起来都很健康 - 它可能已经运行了几周才触发监视器警报(例如).
试图进一步澄清这个问题,如果您阅读Tess .NET内存管理 - 餐馆类比,如果表是堆段,餐厅是否会丢失表(例如免费堆段)?
编辑
我想在 PowerShell中实现PowerShell提供程序.
我一直在想,如果我只是定义类型,然后将它们导入我的会话(import-module),我应该可以使它们可用.
例如,这不起作用,但它沿着我想要实现的路径.
我显然很想念......有人知道这是否可能?
# EnvironmentProvider.ps1
$reference_assemblies = (
"System.Management.Automation, Version=1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
# "System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
)
$source = @"
namespace Providers
{
using System.Management.Automation;
using System.Management.Automation.Provider;
[CmdletProvider("Environments", ProviderCapabilities.None)]
public class EnvironmentProvider : DriveCmdletProvider
{
protected override PSDriveInfo NewDrive(PSDriveInfo drive)
{
return new EnvironmentDriveInfo(drive);
}
protected override object NewDriveDynamicParameters()
{
return base.NewDriveDynamicParameters();
}
}
public class EnvironmentDriveInfo : PSDriveInfo
{
public EnvironmentDriveInfo(PSDriveInfo driveInfo) : base(driveInfo)
{
}
}
}
"@
# -ea silentlycontinue in …
Run Code Online (Sandbox Code Playgroud)