【问题标题】:Is nullifying with memory leaks and performance enough?消除内存泄漏和性能是否足够?
【发布时间】:2013-04-09 13:37:40
【问题描述】:

为对象设置null 值是否足以让垃圾收集器在 Java (Android) 中收集和清理内存?

【问题讨论】:

  • 确保没有对原始对象的引用,然后可以进行垃圾回收,但我认为它不能保证。
  • 给一个对象设置一个null的值与它的GC完全无关。对象被 GC 处理更为常见,因为没有人再引用它们了。

标签: java android performance memory-leaks


【解决方案1】:

是的。这就是在 Java 中释放对象的方式。一旦它们被释放,它们就有资格进行垃圾收集,并在稍后的某个时间被收集。

【讨论】:

    【解决方案2】:

    如果对一个对象的所有引用都设置为空,那么它最终会被垃圾收集器清理掉。这是否足够取决于对象拥有的其他资源(例如可能泄漏的文件句柄或数据库句柄)以及垃圾收集器是否足够频繁地运行以在您需要内存之前释放它。像位图这样的大对象经常有一个函数可以被调用来提前释放内存以避免这个问题(位图的 recycle() 就是一个例子)。

    【讨论】:

      【解决方案3】:

      垃圾收集器会做标记和清扫。

      使用标记和清除时,未引用的对象不会立即回收。相反,允许垃圾堆积,直到所有可用内存都用完为止。发生这种情况时,程序的执行会暂时暂停,而标记和清除算法会收集所有垃圾。一旦所有未引用的对象都被回收,程序的正常执行就可以恢复了。

      http://www.brpreiss.com/books/opus5/html/page424.html。该链接包含有关标记和扫描工作原理的详细信息。

      http://chaoticjava.com/posts/how-does-garbage-collection-work/

      Technical details of Android Garbage Collector

      如果您将变量设置为 null。该变量将可用于垃圾收集。但是,它取决于虚拟机 (dalvik) 来决定何时进行垃圾收集。它还取决于堆大小。堆大小越大,垃圾收集越频繁。 http://www.youtube.com/watch?v=_CruQY55HOk。视频中的人对使用大堆提出了一个很大的警告,因为它会导致更频繁的垃圾收集,从而导致您的应用程序暂停。

      如果当前运行的操作需要更多内存并且内存不可用,垃圾收集器会启动以释放内存。(即使在此之后所需的内存空间不可用,您也会出现内存泄漏)。

      http://developer.android.com/training/articles/perf-tips.html.

      来自上述链接的引用。当您在应用程序中分配更多对象时,您将强制进行定期垃圾收集,从而在用户体验中产生一些“小问题”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-22
        • 2016-01-25
        • 1970-01-01
        • 2012-09-13
        • 2020-07-22
        • 2010-10-13
        • 2019-01-28
        • 2015-02-07
        相关资源
        最近更新 更多