- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不想提出一个模糊的问题,所以我将尽力使这个问题尽可能清楚(尽力而为)。
我知道很长一段时间以来,垃圾回收一直是编程中的灰色地带。我不确定Android或其他手机的情况。
我对android中的垃圾收集的了解:
它收集类系统的类对象(通过对答案的更正制成)。
编辑*“ GC仅在销毁活动后才收集活动项目。活动生命周期由清单中其属性驱动,也由启动活动的意图标志驱动。” – Seva Alekseyev。正如评论员所说。
您可以使用“ System.gc()”强制进行垃圾回收,尽管不建议这样做,因为它可能会删除一些重要的类项目。
现在我从stackoverflow获得了此信息(现在知道它不再是用于垃圾收集的灰色区域)
我的问题:
您如何从中获取有关过程的信息或有关垃圾收集的一般信息(书籍,互联网文章等)?
如果没有问题1的答案,那么在开发需要不断使用内存的应用程序时,应提醒开发人员的其他方法有哪些?
最佳答案
我不确定您的信息是否正确。
它收集类系统类。
否。它收集从任何系统根目录不再可访问的对象的实例。系统根目录包括任何静态引用,来自线程的活动堆栈框架的任何引用,任何活动的同步监视器以及由本机代码段(全局或本地)保存的任何内容。如果存在从对象到根的路径(追溯到参考图),则该对象被视为活动对象(因此无法回收)。没有根目录路径的任何对象都可以由垃圾收集器回收。类由ClassLoader引用,并且从不重载,因此系统不会将其回收,除非收集了ClassLoader并收集了这些类的所有实例。因此Android永远不会收集类系统类,因为永远不会收集ClassLoader。
如果android清单文件指出活动为hasNoHistory或singleTop,则它仅从活动中收集项目
否。活动只不过是对象的实例。当对活动的引用消失时,它所指向的所有引用都会消失,除非其他一些根指向该对象。通过设置singleTop =“ true”,您只是告诉Android实例化此活动的单个实例,并且所有发送的意图将由该单个实例处理。它对GC没有任何影响。当活动松开其到根目录的路径时,无论该活动上的设置是什么,都将对其进行回收。
您可以使用“ System.gc()”强制进行垃圾回收,尽管不建议这样做,因为它可能会删除一些重要的类项目。
没有垃圾收集算法不会删除任何活动对象。根据上面的定义,这意味着GC可以收集您使用的不正确的对象。如果这样做的话,那就是个大错误。这也是垃圾回收算法的优点,因为它们可以保证完美清理垃圾。如果您的内存不足,程序员会忘记删除引用,或者您对内存的使用很粗心。您不应该调用System.gc()的原因是,当最佳时间是回收内存时,您/您的程序就不知道了。垃圾收集器试图最大化(程序运行的时间)与(它花费在收集垃圾上的时间)之比。它保留非常详细的统计信息,并估计何时运行垃圾回收而不是简单地分配更多内存的好时机。
这就像打扫房子。您不能一直清洁,因为这会使您花费更长的时间来做事(例如烹饪)。但是,如果您从不打扫房屋,则可能需要整天打扫。因此,您必须在清洁之前花费多长时间来平衡它,而不是执行任务。
这就是为什么您不应该在程序中计算/猜测/强制GC的原因,因为Android已经为您实现了它,并且将做得比您希望的更好。
这对开发人员意味着什么?
让Android处理何时应运行GC。
清理引用以帮助GC知道何时可以回收某些内容。对静态引用要非常小心,绝不要让静态对象将对活动,服务等的引用保存到一个引用中。
不要分配大量的短期内存。这将迫使更多的GC时间进行清理。通过保守地分配内存,可以定义该比例。
在大多数情况下,GC都非常实用。开发人员遇到的唯一问题是不能为寿命长的对象与UI对象建立界限。如果一个寿命很长的对象具有对UI的引用,则必须注销该UI,否则您将泄漏内存。 UI可以保存对长期存在的对象的引用,但不能相反。
Android的真正问题是您使垃圾收集器工作了多少。如果将要使用的内存量保持较小,则垃圾收集器将不必执行大量工作。这并不意味着您应该重用对象或创建对象池等。但是,您应该知道哪些语句正在创建内存,以及这些对象的生存期。
通常,有关垃圾收集的信息很多,尤其是Java的并发标记和清除垃圾收集器。 Android的垃圾收集器的性能不佳,但是相当不错。在大多数情况下,除非有问题,否则我通常不会担心GC,因此大多数情况下它不会动手。
而且垃圾回收并不是一个灰色地带。自从1994年Java推出以来,它已经非常广泛地理解了这一行业,并且该行业在很大程度上扩展了该领域。
关于android - 通用Android垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11035593/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!