我并不想创建一个含糊不清的问题,所以我会努力让这个尽可能明确(要尽我所能)。
我知道垃圾回收一直在编程的灰色地带了很长一段时间。 我不能肯定与Android或其他手机的情况。
我在安卓知道垃圾收集:
- 它收集类系统类ojbects(从答案通过修正制)。
- 编辑*“GC收集活动项目只有一次的活动被破坏。活动周期是由它的属性清单中的驱动,还通过启动它的意图的标志。” - 塞瓦·阿列克谢耶夫。 正如评论者说。
- 您可以使用强制垃圾回收“的System.gc()”,虽然这是不推荐,因为它可能会删除一些重要的一类项目。
现在我得到来自计算器该信息(现在知道它不再是垃圾回收的灰色地带)
要我的问题:
- 你如何获得关于关于垃圾回收的过程或通用信息(书籍,网络文章等),这些信息?
- 如果没有问题1回答什么是开发人员开发应用程序时需要不断的使用内存来提醒其他方式或方法?
我不知道你的信息是正确的。
它收集类系统类。
不,它收集不再到达任何系统根对象的实例。 系统根包括任何静态参考,从一个线程的活性堆栈帧的任何参考,任何活动同步监视器,以及任何由天然一段代码(全局或局部)保持。 一个对象被认为是活(并因此不能被回收),如果有从它的根部向后跟踪的基准图形的路径。 不不必根的路径的任何对象可以被垃圾收集器回收。 课程由一个ClassLoader引用,除非该ClassLoader是收集和收集这些类的所有实例都从来没有重新加载,因此不回收利用系统。 因此Android从未收集类系统类,因为ClassLoader是永远不会收集。
它收集活动项目“唯一”,如果Android清单文件中指出的活动或者是hasNoHistory或singleTop
第一个活动是没有什么比一个对象的实例多。 而当参考活动走了这么去所有它指出,除非其他一些根源指向对象的引用。 通过设置singleTop =“真正的”你只告诉Android的实例化这个活动的单个实例,并发送所有的意图将是由单一实例句柄。 它没有任何在GC上的影响 。 当活动失去到根其路径将不管什么该活动设置了回收。
您可以使用强制垃圾回收“的System.gc()”,虽然这是不推荐,因为它可能会删除一些重要的一类项目。
没有垃圾收集算法不删除任何活动对象。 在你上面的定义就意味着GC可以收集你使用这是不正确的对象。 如果那样,这是一个很大的错误。 这也是垃圾收集算法,它们是保证完全清理垃圾的美感。 如果您正在运行内存程序员忘记删除引用或你粗心与您使用的内存。 你是不是想给调用System.gc原因()是你/你的程序有没有线索时的最佳时间是回收内存。 垃圾收集器试图最大化的(你的程序运行的时间)对(它花费收集垃圾的时间)的比例。 它保持非常详细的统计数据,使约当它是个好时间来运行垃圾收集VS简单分配更多的内存估计。
这就像打扫你的房子。 因为它使做事有时需要更长的时间,你必须让它变脏(如做饭),你不能在任何时候都干净。 但是,如果你从来没有清理你的房子可能需要一整天进行清洁。 所以,你必须之间有多脏之前清除它花费的时间比执行任务不再可以将它变成一个平衡。
这就是为什么你不应该计算程序/猜/ GC力的Android,因为已经实现了它的你,会做的更好的工作比你能指望。
这是什么意思,对于开发者?
- 让Android处理时,GC应该运行。
- 清理参考,帮助GC知道什么事情可以回收。 要非常小心静态引用,决不允许静态抱到一个活动,服务等方面的参考。
- 不要分配大量的少量短暂的记忆。 这将迫使更多的GC时间来清理。 因为分配的内存保守你应该定义为帮助这个比例。
大多数时候,GC是非常手拿开。 开发商进入长期生活不建立边界唯一的问题对象与UI对象。 如果长期生活的对象具有参考回到那就是你必须注销,否则你会泄漏内存的地方的UI。 这是确定的UI持有长期居住对象的引用,而不是周围的其他方式。
与Android真正的问题是,你赚多少垃圾收集工作。 如果你保持的内存量使用的小型那么垃圾回收器不具备它所要做大的工作。 这并不意味着你应该重用的对象或创建对象池等等。但是,你应该知道什么语句创建的内存,以及这些对象住多久。
有大量的信息在垃圾回收一般,特别是Java的并发标记和清除垃圾收集器。 Android的垃圾收集器并不像高性能,但它是相当不错的。 大多数时候,我不担心GC,除非有一个问题,所以它主要是把手拿开。
和垃圾回收是不是一个灰色地带。 这是非常容易理解,行业已扩大领域颇有几分因为Java最初于1994年推出。