有了 Xamarin(或 maui)iOS 应用程序扩展(
net8.0-ios
,ios-arm64
),我想强制它最大堆大小。不幸的是,苹果规定通知服务扩展只能分配 24MB。
有什么办法,如何指示运行时不允许appex程序集(尝试)分配超过给定的限制?
我已经尝试了
HeapHardLimit
多种方法:
在
csproj
中为:
<ItemGroup>
<!-- Try to limit heap to 20M -->
<RuntimeHostConfigurationOption Include="System.GC.HeapHardLimit" Value="20971520" />
</ItemGroup>
在
runtimeconfig.template.json
在创建
UNNotificationServiceExtension
时的代码中为:
AppContext.SetData("GCHeapHardLimit", (ulong) 20 * 1024 * 1024)
似乎没有任何传播,因为 appex(部署在物理设备上)报告 4G 可用:
GC.GetGCMemoryInfo().TotalAvailableMemoryBytes
然后(经过一些分配)被 iOS 杀死:
kernel EXC_RESOURCE -> App.NSE[10068] exceeded mem limit: ActiveHard 24 MB (fatal)
根据官方解释(Heap limit),建议在
runtimeconfig.template.json
文件中设置HeapHardLimit,并将MetadataUpdater.IsSupported
设置为false。由于您没有提供runtimeconfig.template.json的相关代码,因此可以参考以下代码:
{
"runtimeOptions": {
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.GC.HeapHardLimit": 209715200
}
}
}