【问题标题】:Android - effective performance and memory managementAndroid - 有效的性能和内存管理
【发布时间】:2015-06-02 09:53:05
【问题描述】:

我有一个 MyClass 类,其中包含一个大缓冲区,大约 12Mb。

当我的应用程序运行时,此类的实例会不断(每秒 50 次)更新。

什么是最明智的内存和性能方式: 为每次更新创建一个新对象并让前一个对象被垃圾收集或始终使用相同的对象?而且,使用同一个对象不会造成内存泄漏吗?

或者,在代码中:

MyClass object = new MyClass();
while(appIsRunning)
{
    if (getUpdatedObject(object))
       doSomething(object);
}

优于

while(appIsRunning)
{
    MyClass object = new MyClass();
    if (getUpdatedObject(object ))
       doSomething(object);
}

我试图让这个问题尽可能普遍,但如果需要,我准备添加任何细节。

【问题讨论】:

  • Object instanciation get memory and time...我觉得第一个效率最高。

标签: java android memory-management memory-leaks


【解决方案1】:

一些 java 虚拟机在创建已知大小的小对象时,不会在其范围之外查看,会在堆栈中创建对象,而不是在堆中。例如第 7 版之后的 oracle JVM。所以在里面创建小的固定大小的临时数组可能更有效。

但我不知道 Android 中的 VM 的行为如何。当然,当您的 MyClass 总大小很大时,无论如何它都会在堆中创建。

当在堆中创建对象并且不再引用它时,它将被垃圾收集,这意味着所有其他对象将被检查和/或移动以释放未使用的空间。这需要 CPU 资源并降低应用程序的速度。

因此,当您每次创建新的大对象时,会导致快速的内存使用,并且经常运行垃圾收集器。这会显着减慢应用程序的执行和响应速度。

另一方面,当你在外面创建单个对象时,它不会导致垃圾收集开销,但它的整个内存一直被占用,并且不能被垃圾收集,即使对象没有立即被使用.

较好的折衷方案是使用WeakReferenceSoftReference。它是对象引用的容器,但它们不会阻止对象被垃圾收集。因此,您可以重用您的对象,如果它保存在内存中,或者仅在丢失引用的情况下创建新对象

WeakReference 仅允许您在对象尚未被垃圾回收时获取对它的引用。

SoftReference 强制垃圾收集器保持对象完整,直到堆中没有足够的可用空间。

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多