移动 dotnet 运行时可以受到堆限制吗?

问题描述 投票:0回答:1

有了 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)
ios .net xamarin maui ios-app-extension
1个回答
0
投票

根据官方解释(Heap limit),建议在

runtimeconfig.template.json
文件中设置HeapHardLimit,并将
MetadataUpdater.IsSupported
设置为false。由于您没有提供runtimeconfig.template.json的相关代码,因此可以参考以下代码:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
         "System.GC.HeapHardLimit": 209715200
      }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.