- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在通过 reducing referenced instances 阅读有关帮助 GC 更好地执行的 Xamarin.Android 垃圾收集文档.
该部分开头说:
Whenever an instance of a Java.Lang.Object type or subclass is scanned during the GC, the entire object graph that the instance refers to must also be scanned. The object graph is the set of object instances that the "root instance" refers to, plus everything referenced by what the root instance refers to, recursively.
...我明白了。
然后它会显示一个继承自标准 Activity 类的自定义类。这个自定义 Activity 类有一个字段,它是一个字符串列表,在构造函数中被初始化为有 10,000 个字符串。据说这很糟糕,因为在 GC 期间必须扫描所有 10,000 个实例的可达性。我也明白。
我不清楚的部分是推荐的修复:它说 List<string>
字段应移动到另一个不继承自 Java.Lang.Object
的类然后应该从 Activity 中引用该类的实例,就像之前引用列表一样。
我的问题:当实例总数仍然是 10,000 并且开头段落说它们最终将被扫描,因为该过程是递归的,将字段更深地插入对象图中如何帮助 GC?
作为旁注,我还在阅读 ( here ) Android 上 Mono 使用的 SGen GC,对象图遍历过程被描述为从 GC 根开始的广度优先。这解释了 10,000 项列表如何在检查每个项目时导致更长时间的 GC 暂停,但仍然没有解释将该列表移到图中更深的位置会有什么帮助,因为 GC 最终会在它深入到图中时对其进行扫描。
最佳答案
我会尽我所能解释这一点,我远不是这里的专家,所以任何想插话的人,请插话。
当我们提到做一个peer walk
时,我们是在定位任何根
并遍历实时引用图以查看什么是可达的,什么不是:
根对象:
基本上您必须处理两个托管 GC。我们称它们为 Xamarin GC 和 Android GC 以供引用。
Xamarin.Android 具有对等对象
,用于引用 Android JVM 中已知的 native Java 对象。他们实现了一个核心接口(interface):
namespace Android.Runtime
{
public interface IJavaObject : IDisposable
{
// JNI reference to the Java object it is wrapping.
// Also known as a pointer to the JVM object
public IntPtr Handle { get; set; }
...
}
}
每当我们有一个继承了 IJavaObject
的对象时,它会通过上面的 JNI 句柄保持强引用,以确保只要托管对象处于 Activity 状态,它就会保持 Activity 状态。
这样想:
IJavaObject
-> IntPtr 句柄
-> Java 对象
在 GC 术语中,它将表示为以下内容:
由 Xamarin GC 分配和收集
-> GC Root
-> 由 Android GC 分配和收集
然后我们在 Xamarin.Android 中有一个 GC 进程:
当 GC 运行时,您可以看到它将用弱引用替换强 JNI 句柄,然后调用将收集我们的 Java 对象的 Android GC。因此,将扫描 peer
以查找任何关系,以确保它们在 JVM 中有镜像。这可以防止这些对象被过早收集。
一旦发生这种情况,我们将运行 Android GC,当它完成时,它将遍历对等对象并检查弱引用。
因此,每次 GC 在 peer
对象上运行时,都需要检查和更新此图。这就是为什么这些包装器类型的对象要慢得多,因为必须从对等对象开始扫描整个对象图。
因此,当我们的 peer
对象使用大量对象图时,我们可以通过将引用的存储移到 peer
类之外来帮助 GC 过程。这通常是通过 rooting
我们独立于对等方的引用来完成的。由于它没有存储为字段,因此 GC 不会尝试在对象图上进行关系遍历。
如前所述,在您注意到长 GC 之前,这并不是一个需要担心的大问题。然后,您可以将其用作解决方案。
图片来源:Xamarin 大学( https://www.xamarin.com/university )
关于android - Xamarin Android 垃圾回收算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39066640/
我已经从github https://github.com/xamarin/xamarin-forms-samples下载了Xamarin.Form示例项目 打开任何示例项目后,它不允许我在iOS S
我收到此错误: "MyApp\App.cs(7,7): Error CS0246: The type or namespace name 'Xamarin' could not be found (a
我想知道 Xamarin 是否带有 Mono 运行时及其所有应用程序包。在这种情况下,如果两个基于 Xamarin 的应用程序安装在一个设备上,该设备将拥有两个 Mono 运行时权利。这是 Xamar
如何将库导入 Xamarin? 例如,我将如何导入 json.net为我的项目使用 xamarin? 谢谢 最佳答案 Json.NET可免费获得精美包装 Xamarin-compatible Comp
我不知道如何在输入框中置顶占位符文本。 我有一个很大的输入框,想把占位符文本放在顶部。 最佳答案 您需要为每个平台创建一个自定义渲染器以对齐占位符,如下所示: public class Placeh
我很难找到有关Xamarin.Forms的后台任务支持的文档。 Xamarin.Forms是否提供对定期后台任务的支持? 我需要为Windows Phone 10和Android都实现此功能。 最佳答
Xamarin.iOS中是否提供iOS Picker?我进行了详尽的搜索,但是没有示例,也没有信息可查。但是,它在Xamarin.Form中可用。 最佳答案 UIPickerView的真实示例示例:(
有谁知道是否可以使用 Xamarin.Forms 创建CardView样式(可滚动)列表?我们需要它在iOS和Android上将呈现为相同的。还需要调整阴影等属性(略微提高每张卡) 最佳答案 这是一个
所以,我对 Xamarin 有点陌生,我试图弄清楚如何显示一个包含用户文本输入字段的弹出窗口。 DisplayAlert 不这样做,因为它没有文本输入字段。我应该使用什么? 最佳答案 您可以使用 Di
我有一个运行良好的表单应用程序,但我注意到当页面出现时,背景颜色在几分之一秒内设置不正确。 我有这个代码用于我的 OnAppearing protected override async vo
您好,我正在开发一个具有登录功能的应用程序,它可以选择让您保持登录状态,即使您关闭该应用程序也是如此。 问题是什么?这就是我在 App.cs 中所做的: var statusLog = Appli
由于BackgroundImage是一个字符串,您应该如何设置Page的背景图像?我将不胜感激任何建议。 到目前为止,我已经尝试过: MainPage = new ContentPage {
如何使用 Renderer 在 Xamarin Forms 中使用渐变效果创建此按钮? 最佳答案 在 xamarin 中,您不能将渐变颜色添加为内置功能。您必须创建不同的渲染功能。这个 link 将指
背景:我正在处理一个 C# 项目。过去,当我做 System.Console.WriteLine("Hello"); 我会看到一个弹出控制台打印“你好”。控制台今天消失了,我该怎么做才能让它再次出现?
我们每天都在使用 Xamarin 和 Xamarin Forms,并且经常遇到异常而没有任何关于如何调试的有用信息。 有时它是我们的目标,有时是 Xamarin 中的错误,尤其是 Xamarin Fo
我正在使用 xamarin studio(带有 nuget 包管理插件),并且在我的项目中有一些 nuget 包。 项目上下文菜单中有“管理”和“恢复 nuget 包”,但也有控制台吗? 最佳答案 X
我有一个 CustomCalendar 元素,它是通过扩展 ContentView 并在另一个 ContentPage 中使用此自定义 View 而创建的。我尝试使用非聚焦事件来检测外部点击。但是问题
因此,对于整个MVVM,我还是一个新手。我几乎了解它的基本知识。我有一个可以按原样工作的示例,但是我试图将其更改为MVVM样式。我只是尝试不同的例子,所以我可以学习。 (LoginPage.xaml)
我正在尝试使我的Xamarin项目在Prism和DryIoc中使用MVVM。 我主要想使用自动注册,如下所示: [AutoRegisterForNavigation] ... protected ov
我有一个问题,如何在 Forms Xamarin 中制作模态屏幕,如附加的图像。 我想知道你们是否可以向我发送一段代码或示例以了解如何做到这一点。 https://extravios.com.br/c
我是一名优秀的程序员,十分优秀!